2017-11-07 1 views
1

子コンポーネントからトップレベルの状態を更新する必要があります。子コンポーネントには、この目的のための複数の選択リストがあります。リアクタの複数の入力要素に対するシングルハンドラ

私の子コンポーネントでは:私の親で

constructor(props) { 
    this.updateNoOfSets = this.updateNoOfSets.bind(this); 
    this.updateNoOfRounds = this.updateNoOfRounds.bind(this); 
} 

updateNoOfSets() { 
    this.props.updateNoOfSets(parseInt(this.updatedNoOfSets.value)); 
} 

updateNoOfRounds() { 
    this.props.updateNoOfRounds(parseInt(this.updatedNoOfRounds.value)); 
} 

<select 
    value={this.props.noOfSets} 
    onChange={this.updateNoOfSets} 
    ref={(input) => { 
    this.updatedNoOfSets = input; 
    }} 
> 
    <option>1</option> 
    <option>2</option> 
    <option>3</option> 
</select> 

<select 
    value={this.props.noOfRounds} 
    onChange={this.updateNoOfRounds} 
    ref={(input) => { 
    this.updatedNoOfRounds = input; 
    }} 
> 
    <option>1</option> 
    <option>2</option> 
    <option>3</option> 
</select> 

constructor(props) { 
    super(props); 
    this.updateNoOfSets = this.updateNoOfSets.bind(this); 
    this.updateNoOfRounds = this.updateNoOfRounds.bind(this); 
} 

updateNoOfSets(noOfSets) { 
    this.setState({'noOfSets': noOfSets}); 
} 

updateNoOfRounds(noOfRounds) { 
    this.setState({'noOfRounds': noOfRounds}); 
} 

これは作業が、私には非常に冗長思われます。これを書くためのより短い方法がありますか?私のコード例は2つの選択リストしか持っていませんが、私の実際のアプリケーションはもっと運賃があります。

+0

親の状態を子に変更する親の関数を小道具として渡すだけです。子コンポーネントでは、このメソッドを取得してselectメソッドでトリガーすることができます。 – cdaiga

+0

これは私がupdateNoOfSetsでやっていることではありませんか? – Evans

+0

これは、バインディングに問題がある可能性があることを意味します。 – cdaiga

答えて

0

選択要素ごとに複数のハンドラは必要ありません。必要なのは十分にインテリジェントで、単一のハンドラである

子:

constructor(props) { 
    this.updateValue = this.updateValue.bind(this); 
} 

updateValue(item, value) { 
    this.props.updateValue(item, parseInt(value)); 
} 

<select 
    value={this.props.noOfSets} 
    onChange={(e) => this.updateValue('noOfSets', e.target.value)} 
> 
    <option>1</option> 
    <option>2</option> 
    <option>3</option> 
</select> 

<select 
    value={this.props.noOfRounds} 
    onChange={(e) => this.updateValue('noOfRounds', e.target.value)} 
> 
    <option>1</option> 
    <option>2</option> 
    <option>3</option> 
</select> 

親:

constructor(props) { 
    super(props); 
    this.updateValue = this.updateValue.bind(this); 
} 

updateValue(item, value) { 
    this.setState({[item]: value}); 
} 

EDIT:render方法でbinding機能ではないことに注意してくださいレンダリングが実行されるたびに良いアイデアが返されます。新しい関数が返されます。how to avoid binding in render method

+0

興味があるのはなぜアイテムは[アイテム]である必要がありますか?私はそれが大括弧なしで動作しないことを確認することができますが、私はなぜこれが当てはまるのかわかりません。 – Evans

+1

ダイナミックキーは大括弧で囲む必要があります。そうでない場合は、キーとして扱われます –

関連する問題