React: IME構成が終了する前に、倉曎むベントが䜙分に発生したす

䜜成日 2015幎05月21日  Â·  48コメント  Â·  ゜ヌス: facebook/react

远加の詳现

  • 远加の詳现ず分析の再珟に関する同様の議論 https 
  • 以前の修正の詊み https 

原著

https://facebook.github.io/react/blog/2013/11/05/thinking-in-react.htmlからこの䟋を詊しおいたずき、䞭囜語の拌音入力メ゜ッドで入力された挢字は、次のような倚くのレンダリングを起動したす。 

screen shot 2015-05-21 at 14 04 36

実は挢字を確認する前に発砲しないず思いたす。

次に、別の皮類の入力方法であるwubi入力方法を詊したした。次のようになりたした。

screen shot 2015-05-21 at 14 17 15

それも倉です。 だから私はjQueryでテストをし

screen shot 2015-05-21 at 14 05 12

スペヌスバヌを抌しお文字を確認した埌でのみ、 keyupむベントが発生したす。

jQuery keyupずreact onChangeの実装では異なる可胜性があるこずは知っおいたすが、jQuery keyupがreactのonChangeではなく挢字を凊理する方法を期埅しおいたす

最も参考になるコメント

こんにちは、Facebookの人は、実際にはこの問題は深刻な問題が発生したす。我々は䞭囜の入力ず非同期入力を曎新するこずはできたせん。
たずえば、すべおのフィヌドバックが非同期で曎新されるため、流星反応デヌタ゜ヌスやreduxのようなストアを䜿甚するこずはできたせん。
この問題を瀺す最も簡単な䟋を次に瀺したす。setTimeoutを䜿甚しお非同期曎新を実行したす。
https://jsfiddle.net/liyatang/bq6oss6z/1/

これを迅速に修正しお、䜕床も䜕床も回避するための努力を無駄にしないようにしおください。

ありがずう。

これが私の回避策です。 誰かが同じ問題に盎面しおいるなら、あなたは芋るこずができたす

党おのコメント48件

cc @salier :) –ここで䜕をすべきですか

IME文字列がコミットされるたでonChangeを起動するべきではないず思いたす。

ChangeEventPluginこれを凊理する1぀の方法は、 compositionstartずcompositionend間のすべおのinputむベントを無芖し、すぐにinputむベントを䜿甚するこずです。次のcompositionend 。

SimplifiedPinyinず2-SetKoreanを䜿甚しおOSXChromeずFirefoxで簡単なテストを行いたしたが、むベントの順序ずデヌタは十分に正しいようです。 IE韓囜語で問題が発生するず予枬しおいたすが、幞運になるかもしれたせん。

Google Input Tools拡匵機胜などの代替入力方法で匕き続き問題が発生する可胜性があるず思いたすが、回避策がある可胜性がありたす。

これは、ラテン語の匁蚌法文字の入力方法にも圱響したす。 eを長抌ししおからバリアントを䜿甚するこずでさえ、ここでは倱敗しおいたす。

申し蚳ありたせんが、これは関係がないようです。 謝眪いたしたす。

曎新はありたすか この問題にも苊しんでいたす。

珟圚はありたせん–これは珟時点では優先床が高くありたせん。 誰かがこれを修正するこずに飛び蟌んだら、プルリク゚ストを芋お喜んでいたす。

@salier IEはcompositionend埌にinputむベントを発生させないようです。 IE11ずWindows10のEdgeでテストしたした。ChromeずFirefoxで正しく起動したす。

すなわち9では、挢字を再床入力するず、Changeむベントが䜕床も発生したす

こんにちは、Facebookの人は、実際にはこの問題は深刻な問題が発生したす。我々は䞭囜の入力ず非同期入力を曎新するこずはできたせん。
たずえば、すべおのフィヌドバックが非同期で曎新されるため、流星反応デヌタ゜ヌスやreduxのようなストアを䜿甚するこずはできたせん。
この問題を瀺す最も簡単な䟋を次に瀺したす。setTimeoutを䜿甚しお非同期曎新を実行したす。
https://jsfiddle.net/liyatang/bq6oss6z/1/

これを迅速に修正しお、䜕床も䜕床も回避するための努力を無駄にしないようにしおください。

ありがずう。

これが私の回避策です。 誰かが同じ問題に盎面しおいるなら、あなたは芋るこずができたす

compositionstart compositionendむベントずonchangeむベントの問題で䞭囜語のIMEが入力されないようにする方法をデモする簡単な䟋を䜜成したした。
リンクは次のずおりです https 

@eyesofkids玠晎らしい仕事、これは入力、textarea ...のonChangeのデフォルト実装ずしお䜜成できたす。

よくやった 

私は同じ問題にぶ぀かっおいたした、そしお@eyesofkidsの回避策は完党に機胜したすありがずう。

回避策を講じた埌、私はReactの゜ヌスコヌドに飛び蟌んで、少なくずもこれに察する倱敗したテストを远加しようずしたした。埌でラむブラリに期埅される動䜜を远加したいず思っおいたしたが、内郚に䞍慣れな人にずっおは少し耇雑に思えたす。

圓初、 ChangeEventPluginすでに利甚可胜なものず同様のテストが機胜するこずを期埅しおいたした。぀たり、ネむティブのcompositionStart / compositionUpdateをシミュレヌトし、 onChangeコヌルバックがないこずを確認したした。解雇された; たた、 onChangeチェックは、 compositionEndがシミュレヌトされた堎合にのみ発生したす。 ただし、これは機胜しおいないようです。

したがっお、 ChangeEventPlugin.extractEvents()をチェックするこずは、 SelectEventPluginテストで行われるのず同様に、実行可胜なアプロヌチになるず考えおいたした。 ここでは、䜕らかの理由で、むベントを抜出するずきに垞にundefined取埗したす。
参考たでに、これは_ChangeEventPlugin-test.js_内で詊したテストコヌドです。

  var EventConstants = require('EventConstants');
  var ReactDOMComponentTree = require('ReactDOMComponentTree');
  var topLevelTypes = EventConstants.topLevelTypes;

  function extract(node, topLevelEvent) {
    return ChangeEventPlugin.extractEvents(
      topLevelEvent,
      ReactDOMComponentTree.getInstanceFromNode(node),
      {target: node},
      node
    );
  }

  function cb(e) {
    expect(e.type).toBe('change');
  }
  var input = ReactTestUtils.renderIntoDocument(
    <input onChange={cb} value='foo' />
  );

  ReactTestUtils.SimulateNative.compositionStart(input);

  var change = extract(input, topLevelTypes.topChange);
  expect(change).toBe(null);

これらのテストをどのようにデバッグするのか正確にはわからないのではないかず思いたす。そうしないず、䜕が起こっおいるのかをより明確に把握できたす。 進め方やその他の指針に぀いおのガむダンスをいただければ幞いです。

Chrome 53+で回避策が突然壊れ、 compositionendが起動される順序が倉曎されたため、無効になっおいるようです。以前textInput前に発生しおいたしたが、珟圚はtextInputたす。 この結果、コンポゞション䞭にchangeが䞭止されおも、

https://github.com/suhaotian/react-input倚分誰かを助ける

Chromev53にはトリッキヌな゜リュヌションがありたす。 compositionendが発生した埌にhandlechangeを呌び出すため。

handleComposition  = (event) => {

    if(event.type === 'compositionend'){
      onComposition = false

      //fire change method to update for Chrome v53
      this.handleChange(event)

    } else{
      onComposition = true
    }
  }

ここでデモを確認しおください https 

@chenxsanあなたは解決策を芋぀けたしたか
CompositionStartを怜出し、倉数をtrueに等しくするこずができたす。
次に、onChangeで蚭定した倉数を䜿甚しお、ク゚リを実行する必芁があるかどうかを確認したす

8683で制埡コンポヌネントの新しい問題を

制埡されおいないコンポヌネントず制埡されおいるコンポヌネントinput、textareaの䞀時的な゜リュヌションは、 react-compositioneventにアップロヌドされたす。

https://github.com/facebook/react/pull/8438を実珟させたしょう。

@yesmeckはこのニュヌスを芋おずおも幞せです。

テストはWebkitのみに焊点を圓おおいるのを芋たしたが、Chromeは53+以降にcompositionendむベントトリガヌの順序を倉曎するため、ChromeずSafariに分ける必芁がありたす。

@ eyesofkids53歳未満のChromeの新しいテストケヌスを远加したした。

火に燃料を远加するために、私はこの問題を回避しようずしたしたが、珟圚のバヌゞョンのiOSサファリが日本のひらがなIMEを䜿甚しおいるずきにcompositionendむベントをトリガヌしないこずを発芋したした。これは意図的なものだず思いたす。䜜曲メニュヌが閉じられおいないようです。
@eyesofkidsの䟋では、inputValueが曎新されるこずはありたせんが、私にずっおはhttps://github.com/zhaoyao91/react-optimistic-inputで日本のIMEの問題が修正されおい

これに察する解決策を探しおいる人のために、すぐに䜿甚できるコンポヌネントがありたす。 https://github.com/aprilandjan/react-starter/blob/test/search-input/src/components/SearchInput.js通垞のテキスト入力芁玠の代わりに䜿甚するだけで、すべお問題ありたせん。

@ zhaoyao91あなたの回避策はうたくいきたす ありがずう。

やあみんなこの問題のいく぀かのニュヌス

onChangeの起動が頻繁に発生しおも問題が発生するこずはめったにないため、優先床は高くありたせん。 アプリのどこで問題が発生しおいたすか

@sophiebits申し蚳ありたせんが誀っお「X」をクリックしたした。 これにより、倉曎むベントハンドラヌで䜿甚されるフィルタリング操䜜たたはサヌバヌコヌルバックがある堎合、パフォヌマンスが䜎䞋する可胜性がありたす。 https://github.com/facebook/react/issues/3926#issuecomment -316049951に瀺されおいるアプロヌチは、制埡されおいない入力たたはネむティブ入力に察する優れた回避策ですが、Reactで制埡された入力に適切にマッピングされたせん。 このスレッドの䞀郚がPRを開発しようずしたが、内郚が少し耇雑であるこずがわかったようですが、チヌムの゚ンゞニアがより迅速に䜜業できるのではないでしょうか。 https://github.com/facebook/react/issues/8683は、実際の問題IMOのはるかに優れた説明です。

誰かが私が理解するのを手䌝っおくれたせんか問題は厳密に途䞭の䜙分なonChange呌び出しにありたすか それずも、最終的に間違った倀を取埗したすか

onChangeが呌び出された回数に関するアサヌションを削陀するず、 https//github.com/facebook/react/pull/8438での修正詊行のテストに合栌しonChange呌び出しに関するものだず思いたす。

䜙分なonChange呌び出しはありたせん。最埌に誀った倀を取埗しおいるだけで、onCompositionの問題のようです。

@crochefluidこれに察しお倱敗するテストを䜜成できたすか 8438がやろうずしたこずず䌌おいたす。 そのテストでは、誀った倀はありたせんでした。

@gaearonやっおみたす。 サファリmac / IOSでそのテストを詊したしたか

これはノヌドテストですが、さたざたなブラりザやデバむスからキャプチャされたシヌケンスを゚ンコヌドしたす。 その゜ヌスを参照しおください。 倱敗しおいるシヌケンスを远加する必芁がありたす。

したがっお、この問題は远加のonChange呌び出しに関するものだず思いたす。

䞁床。

私はただこの問題を抱えおいたす。 この問題は3幎間開いおいるようですが、Reactは珟圚、制埡されたコンポヌネントでの䞭囜語入力をサポヌトしおいたすか

これも日本語で特定の文字で芋おいたす...

これが私の問題を再珟するコヌドサンドボックスです。 フォヌムに関連しおいるようです。 入力を盎接䜿甚するこずは問題ありたせん。

https://codesandbox.io/s/0m1760xqnl

私はいく぀かのケヌスを远加したした
反応状態ずプレヌン入力の䜿甚は問題ありたせん
反応状態、プレヌンフォヌム、プレヌン入力の䜿甚は問題ありたせん
動䜜しおいないコンテキストベヌスのフォヌムコンポヌネントを䜿甚しおいたす。 コンテキスト関連の問題である可胜性がありたす。

問題は解決したしたcodepenで動䜜させたした。 䜕らかの理由で、props=>を枡すずきに、コンポヌネントずしお「input」を枡すこずが機胜したしたしなかった。

誰もが違いが䜕であるかに぀いおの考えを持っおいたすか

実際、私も詊したした

䜜品

<Field {...otherProps} component="input" />

動䜜したせん

<Field {...otherProps} component={(props) => <input {...props} />} />

奇劙なこずに十分に機胜したす

const WrappedInput = (props) => <input {...props} />
...
<Field {...otherProps} component={WrappedInput} />

明らかに、私が理解しおいない魔法がここで起こっおいたす。 😕

曎新はありたすか

IMEを有効にするず、誀った結果が発生するようです

e84721f3ec71a5ce043ef8290

@otakustayず同じ問題が発生したした
IME入力で制埡された入力をサポヌトするこずは䞍可胜のようです。 むベントのシヌケンスを次のように远跡したした。

  1. ナヌザヌが文字を入力したす。たずえば、 w
  2. onChangeがトリガヌされたす
  3. 状態が新しい倀で曎新されたす
  4. 新しい倀は、 value属性を介しおinput䌝播されたす。
  5. IMEの「構成」はこの時点で䞭断されたす

    • 入力芁玠にw文字列がありたす

    • IMEバッファに栌玍されおいる個別のw文字列もありたす

  6. ナヌザヌが別の文字を入力したす。たずえば、 a
  7. 入力aの文字列は、IMEバッファの文字列ず結合しお、 wwaを生成したす。
  8. 手順1〜7を繰り返しお、重耇する文字の束を取埗したす。

バグは、次の再描画埌のcompositionUpdateむベントの15ms以䞊埌に入力が再レンダリングされた堎合にのみ発生するこずに気づきたした。

今のずころ、私の唯䞀の解決策は、制埡された入力から切り替えるこずです。

線集これは単玔な耇補です https 
Edit2 これが私のハッキヌな回避策です https  //jsfiddle.net/m792qtys/ cc

これに関する曎新はありたすか

曎新??

これに関する曎新はありたすか

唖然ずしたした、私はこの質問に盎面したした

興味深いこずに、問題は耇数回のonChangeだけではないようです。 onCompositionStartずonCompositionEnd間にsetStateがない堎合、reactは倀をそのたた「制埡」したす。 このアクションにより、構成が䞭断されたす。 ぀たり、 onCompositionEndむベントが発生しないこずを意味したす......間違っおいる堎合はplzず蚀っおくださいしかし、状態をすぐに倉曎するこずしかできたせんそうでない堎合は、問題に盎面する必芁がありたす@ knubieの蚀及。 ここでの耇補「半分制埡された」コンポヌネントのように芋えたす https 

しかし、私はこの問題が5幎間修正されないこずにずおも驚いおいたす😢

@hellendag IME文字列がコミットされるたで、onChangeを起動するべきではないず思いたす。

コンポヌネントが「コミットされおいない」IME文字列を知りたい堎合があるため、これは有効な解決策ではないず思いたす。たずえば、ナヌザヌが入力するずきにリスト内のオプションをフィルタリングしたす。

この他のスレッドで䜿甚しおいるアプロヌチがこの問題にぶ぀かる人に圹立぀かどうかはわかりたせんが、念のためにリンクを瀺したす //github.com/facebook/react/issues/13104#issuecomment -691393940

曎新はありたすか

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡