バグ
現在の動作は何ですか?
input type = "number"の場合、初期値が設定されていると、ステップが期待どおりに機能しません。 ステップは、初期値が「」またはnullの場合にのみ尊重されるようです。
例:
https://codepen.io/anon/pen/MQMBmX
この例では、制御された入力バインディング値とステップを使用しています。 ステップは値の1/10です。 テキストボックスの値を50000に編集し、ステッパーを使用してインクリメントすると、50100にインクリメントされます(つまり、現在のステップではなく初期値によって)。
初期値が「」またはnullになるようにコードを編集します。 テキストボックスを50000に編集し、ステップアップします-値は期待どおり55000になります。
期待される動作は何ですか?
最初に入力コンポーネント値をnullまたは ""に初期化することなく、ステップを尊重する数値入力をレンダリングできるはずです。
初期値が提供されると、DOMに値属性が書き込まれるようです(例:value = "100")。 初期値が ""またはnullの場合、value属性のみが割り当てなしでDOMに書き込まれます。 例(値)。
この問題の影響を受けるReactのバージョンとブラウザ/ OSはどれですか?
16.3.0-alpha.1(まだ問題があるかどうかを確認するためにこのバージョンに移植されています)
0.14.7(元々このバージョンで見つかりました)
Chromeにのみ影響するようです(確認済みのWindowsとMac、バージョン59と64)。 バグはSafariには表示されません(少なくともMacでは)。
Windows10のChrome64とDebianのFirefox52の両方で、このフィドルで非常に特殊な動作が見られます。 入力に50000と入力し、すぐに上矢印をクリックすると、50100になります。入力に50000と入力し、ドキュメント内の他の場所をクリックしてから、上矢印をクリックすると、55000になります。
値を変更する必要はありません。上矢印を複数回クリックすると、意味のない数値に変更され始めます。
@andyboyneのレポートをありがとう。 この問題は、フィールドがぼやけるまで数値入力のvalue
属性を更新しないという事実に起因します。 これは、ブラウザーの検証に関連する多数の不要な動作を回避するために行います。 cc @ nhunzaker。
これは、制御された入力https://github.com/facebook/react/issues/11896のvalue
属性の同期を最終的に停止したら解決する必要があります。
はい。 実は、これについてタイムラインをまとめるべきかと思います。
よく言われるように、これは同期の問題であり、フィールドがぼやけているとフィールドは同期します。
そこで、console.logを追加したところ、フィールドがぼやけていない間はe.target.valueとe.target.getAttribute( "value")が同期されていないことがわかりました。
したがって、回避策はe.target.setAttribute( "value"、e.target.value);を追加することです。 この値を強制的に更新すると、期待どおりに機能します。
onChange={e => {
console.log("target" , e.target.value);
console.log("getAttribute value", e.target.getAttribute("value"));
e.target.setAttribute("value",e.target.value);
this.setState({value: e.target.value, step: e.target.value / 10});
}}
いいえ、これはまだ問題です、それは私を夢中にさせます、私たちはまだv16によって制御された入力を単純化していません!
最も参考になるコメント
はい。 実は、これについてタイムラインをまとめるべきかと思います。