2016-05-17 6 views
2

私はsetStateを入力のonChangeハンドラで次のダニに延期する必要がある小さなユーティリティを作成しています。基本的なコンセプトを示す簡単なスニペットの下に。アクセントと遅延リアクションの入力onChange

https://jsfiddle.net/samuelsimoes/q3p44sz1/

class MyComponent extends React.Component { 
    constructor() { 
    super(...arguments); 
    this.state = {}; 
    } 

    onChange (value) { 
    setTimeout(v => { 
     this.setState({ name: v }); 
    }.bind(this, value), 0); 
    } 

    render() { 
    return (
     <div> 
     <input 
      type="text" 
      value={this.state.name} 
      onChange={evt => this.onChange(evt.target.value)} /> 
     </div> 
    ); 
    } 
}; 

ReactDOM.render(
    <MyComponent/>, 
    document.getElementById("app-container") 
); 

あなたは、Mac OS上のブラウザでこのスニペットを実行し、各ブラウザ上で異なるぎこちない動作を取得アクセントでいくつかの文字を入力しようとします。 Chromeでは、アクセントがもう適用されなくなった後で初めてアクセントが動作します(下のgifを見てください)。 Firefoxでは、アクセントと文字は表示されません。

Bug on Chrome

君たちはこれについてどの手掛かりを持っていますか?

p.s .:この反応は、0.13,0.14および15.0.2の反応で試験した。

+0

あなたが直面している問題については不明です。しかし、 'charset'をUTF-8やISO-8859-1として解決すると思いますか? – anoop

+0

@anoop jsfiddleは既にUTF-8で動作します。私はcharsetの問題ではないと信じています。私はあなたに人々が理解するのを助けるために問題を示すgifで質問を更新しました。 –

答えて

1

基本的にsetStateを延期しないでください。このような状況では、リアクションは正しく機能しません。

ルック:https://github.com/facebook/react/issues/6563

何が起こっている:

のは、あなたが手紙Aを押すと仮定しましょう。

  1. あなたがフィールドにonChangeをトリガーすると、プロセスはすべての状態変異が反応します。

  2. ReactはDOM diffを実行してコンポーネントを更新します。この段階では、このフィールドの状態値は空の値なので、Reactはnode.value = ""を実行します。

  3. setStateが遅れて、Anode.value = "A"という文字が適用されます。

この動作は、彼らが強調文字を入力するようにユーザーを防止型付きアクセントに「中間状態」にアクセントを交換MacOSでのブラウザを破ります。

悲しいことに、解決策はありません。

関連する問題