[解決済み] react jsでonchangeイベントを発生させる最良の方法は何ですか?
質問
Backbone + ReactJSのバンドルを使って、クライアントサイドのアプリを構築しています。
主に悪名高い
valueLink
に依存し、双方向バインディングのための ReactJS インターフェースをサポートする独自のラッパーを介して、値をモデルに直接伝播させます。
ここで問題に直面しました。
私たちは
jquery.mask.js
プラグインがあり、これは入力値をプログラムでフォーマットするため、React イベントを発生させません。このため、モデルが
を受け取ることになります。
の値を受け取り
フォーマットされたものを見逃す
をプラグインから取得します。
Reactはブラウザによって多くのイベント処理戦略を持っているようです。特定のDOM要素の変更イベントをReactに通知する一般的な方法はありますか?
どのように解決するのですか?
React 16とReact >=15.6について。
セッター
.value=
は React ライブラリが入力値セッターを上書きしてしまうため、思い通りに動作しませんが
input
をコンテキストとして直接呼び出すことができます。
var nativeInputValueSetter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, "value").set;
nativeInputValueSetter.call(input, 'react 16 value');
var ev2 = new Event('input', { bubbles: true});
input.dispatchEvent(ev2);
textarea要素には
prototype
の
HTMLTextAreaElement
クラスと同じです。
新しい コードペンの例 .
React <=15.5 だけの古い回答です。
とは
react-dom ^15.6.0
を使うことができます。
simulated
フラグを使用すると、イベントを通過させるためにイベントオブジェクトに
var ev = new Event('input', { bubbles: true});
ev.simulated = true;
element.value = 'Something new';
element.dispatchEvent(ev);
を作りました。 のコードペンを作成しました。
なぜ新しいフラグが必要なのかを理解するために、私は このコメント が非常に役に立ちました。
<ブロッククオートReactの入力ロジックはchangeイベントをdedupeするようになったので、値ごとに複数回発火することはありません。 が発生しないようにしました。ブラウザの onChange/onInput イベントの両方をリッスンします。 イベントと、DOM ノードの値のプロパティのセット (JavaScriptで値を更新したとき) の両方をリスンします。 の値を更新したとき)。このことは、次のような副作用があります。 入力の値を手動で更新する場合 input.value = 'foo' とし、次のようにディスパッチします。 ChangeEvent with { target: input } をディスパッチします。React は set と event の両方を登録します。 とイベントの両方を登録し、値がまだ `'foo' であることを確認すると、重複する イベントとみなし、それを飲み込みます。
これは通常のケースでは問題なく動作します。 イベントは、element.value のセットをトリガーしないためです。このロジックから抜け出すには このロジックを回避するには、発生させるイベントにシミュレートフラグを付けます。 フラグを付けると、react は常にそのイベントを発生させます。 https://github.com/jquense/react/blob/9a93af4411a8e880bbc05392ccf2b195c97502d1/src/renderers/dom/client/eventPlugins/ChangeEventPlugin.js#L128
関連
-
[解決済み】Typescript react - モジュール ''react-materialize'' の宣言ファイルが見つかりませんでした。'path/to/module-name.js' は暗黙のうちに any 型を持ちます。
-
[解決済み] ReactJsのCreateClassは関数ではない
-
[解決済み] Reactのこの3つの点は何をするところなのでしょうか?
-
[解決済み] React NativeとReactの違いは何ですか?
-
[解決済み] Reactのstateとpropsの違いとは?
-
[解決済み] React / React Nativeでコンストラクタを使用する場合とgetInitialStateを使用する場合の違いとは何ですか?
-
[解決済み] Reactでes6クラスを使うときの「super()」と「super(props)」の違いとは?
-
[解決済み] Reactで親の状態を更新するにはどうしたらいいですか?
-
[解決済み】Enterキーを押した後にonChangeイベントを呼び出す方法
-
[解決済み】React JSを使ったドロップダウンのOnChangeイベント
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】コンポーネントの定義に表示名がない react/display-name
-
[解決済み】Reactを使用したMapBoxのCSSが欠落している件
-
[解決済み】ngrokがReact devサーバーに接続しようとすると、無効なホストヘッダが表示される。
-
[解決済み] SVGサークル内の画像にボーダーを追加する方法
-
[解決済み] リアクトです。<tr>は<td>の子として表示できません。コメント > td > tr を参照してください。
-
[解決済み] eslint: no-case-declaration - case ブロックで予期しない字句の宣言があった。
-
[解決済み] アクシオスは定義されていません
-
[解決済み] Cross-envでyarnの実行時にenv変数が変更されない。
-
[解決済み] Reactでグローバル変数を宣言する方法とは?
-
[解決済み] React」は定義される前に使用されていた