2016-10-03 12 views
2

私は複数の入力を持っており、maxlengthに達すると入力フォーカスを次の入力にしようとしています。私は、各入力は異なるonChangeイベントハンドラを持っている必要はありませんこの反応成分はどのように簡略化できますか?

handleTextChange1(e) { 
    const { value, maxLength } = e.target; 
    if (value.length === maxLength) { 
     ReactDOM.findDOMNode(this.nextComponent1).focus(); 
    } 
} 
handleTextChange2(e) { 
    const { value, maxLength } = e.target; 
    if (value.length === maxLength) { 
     ReactDOM.findDOMNode(this.nextComponent2).focus(); 
    } 
} 
render() { 
    return (
     <form onSubmit={this.handleSubmit.bind(this)}> 
      <input onChange={this.handleTextChange1.bind(this)} maxLength="4"/> 
      <input ref={c => this.nextComponent1=c} onChange={this.handleTextChange2.bind(this)} maxLength="4" /> 
      <input ref={c => this.nextComponent2=c} maxLength="4"/> 
     </form> 
    ) 
} 


はここに私のコードです。

私はこれを単純化することができますか、または私がしようとしていることを達成するためのより良い方法はありますか?あなたは周りのrefがすぐに設定されていない作品が必要になる場合があり、実際のイベントハンドラ

... onChange={this.focusWhenChangeHappened(this.component1)} ... 
... onChange={this.focusWhenChangeHappened(this.component2)} ... 

を取り付け

focusWhenChangeHappened(component) { 
    return function eventHandler(e) { 
    const { value, maxLength } = e.target; 
    if (value.length === maxLength) { 
     ReactDOM.findDOMNode(component).focus(); 
    } 
    } 
} 

+3

それが動作する場合、これはちょっと、それを指摘してくれてありがとうコードレビューの姉妹サイト –

+0

@SamiKuhmonenに適しかもしれません。私はそれが存在することを知らなかった。 – Dan

答えて

1

簡単に簡略化し、DRYerにすると、次のコンポーネントを渡して、onChangeハンドラの引数としてフォーカスすることができます。

https://jsbin.com/cakujozoga/edit?html,js,output

var App = React.createClass({ 
    handleSubmit: function() {}, 

    handleTextChange: function(nextComponent, e) { 
    const { value, maxLength } = e.target; 
    if (value.length === maxLength) { 
     ReactDOM.findDOMNode(this.refs[nextComponent]).focus(); 
    } 
    }, 

    render: function() { 
    return (
     <form onSubmit={this.handleSubmit.bind(this)}> 
      <input onChange={this.handleTextChange.bind(this, "nextComponent1")} maxLength="4"/> 
      <input ref="nextComponent1" onChange={this.handleTextChange.bind(this, "nextComponent2")} maxLength="4" /> 
      <input ref="nextComponent2" maxLength="4"/> 
     </form> 
    ) 
    } 
}); 
+0

こんにちは、ありがとうございましたが、[ref string](https://facebook.github.io/react/docs/more-about-refs.html#the-ref-string-attribute)を使用すべきではないと思いました。 refコールバックでそれを行うことは可能ですか? – Dan

+0

確かに、この[jsBin](https://jsbin.com/xaqekujela/1/edit?html,js,output)をチェックしてください。 – dzv3

+0

もう一度ありがとう! – Dan

0

はあなたのイベントハンドラを一般化します。

関連する問題