2016-08-11 9 views
2

私はonFocusonBlur、およびrefのコールバックを設定したいReactにinput要素を持っています。 refコールバックを設定すると、input.focus()を内部で実行すると、onBlurイベントが発生するという望ましくない動作が発生します。`ref`によって呼び出されたinput.focus()は` onBlur`イベントを呼び出す

<input 
    onFocus={() => { 
     props.startSearch(); // set props.active === true 
    }} 
    onBlur={() => { 
     props.endSearch(); // set props.active === false 
    }} 
    ref={(input) => { 
     if (input && props.active) { 
      input.focus(); 
     } 
    }} 
/> 

私は、アクション設定props.activeをtrueにディスパッチする別のコンポーネントを持っています。これは、入力コンポーネントに焦点を当てるべきです。しかし、部品のマウント、予期せず入力のonBlurコールバック火災時に:

ref => onFocus => onBlur

は、これはtrueにprops.activeを設定しているが、その後すぐに、それは偽(props.endSearch火災ので)を設定します。

私がinput.focus()をコメントアウトし、手動で入力をフォーカスするには、onFocus => refが必要です。しかし、これは明らかに入力を「自動焦点合わせ」する効果はありません。


なぜinput.focus()は火にonBlurをトリガされ、どのように私はこれを防ぐことができますか?

+0

'REF => onFocus'、右?私の唯一の推測は、あなたが入力に焦点を当てた直後に何かが焦点を盗んでいるということです。フォーカスはどこで終わるのですか? – Aaron

+0

はい、 'ref => onFocus'は望ましい動作です。アクティブな要素はちょうど 'body'で、フォーカスを盗む方法がわからない... – Himmel

+0

' document.querySelector( ":focus") 'はあなたに何を与えるのですか? – Aaron

答えて

1

autoFocusを試してみてください。同様に:

<input ref="searchBox" onFocus={props.startSearch} onBlur={props.endSearch} autoFocus={props.active} /> 

編集:

また、あなたのcomponentDidUpdateで行う(上記更新refに注意してください):あなたが希望する動作があることを意味

if (this.props.active) { 
    this.refs.searchBox.focus(); 
} 
+0

'autoFocus'(' props.active'がtrueに設定されている場合)は、ページをリフレッシュすると更新されるようですが、prop値を反映する効果はありません。つまり、動的に更新されません。 – Himmel

+0

@Himmel私の編集を試してください。 – Jack

+0

親コンポーネントからこれらのステートフルアクションを処理しようとしていますが、親コンポーネントからの参照を割り当ててアクセスできますか? – Himmel

関連する問題