2017-01-25 7 views
1

私はユーザーがいくつかのテキストフィールドを指定し、この量のフィールドを動的にレンダリングするアプリケーションを構築しています。状態を設定して各フィールドで一意になるようにするのに問題があります。リアクションのテキスト入力によるループ処理

現在、フィールドの1つを変更すると、他のすべてのフィールドはその一意のフィールド状態で更新されます。ここに状態を設定するhandleChange関数があります:

handleChange: function(e){ 
     this.setState({ 
      value: e.target.value, 
     }); 
    } 

状態を配列として初期化し、そのように入力を追跡できますか?それとももっと良い方法がありますか?

答えて

2

状態の値の配列を維持すると正常に動作します。更新の対象を知るためには、入力のインデックスを渡していることを確認するだけで済みます。 bindはこれに役立ちます:

class YourComponent extends React.Component { 
    constructor(props) { 
    super(props); 
    this.state = { values: [] }; 
    } 

    handleChange(i, e) { 
    this.setState({ 
     values: { ...this.state.values, [i]: e.target.value } 
    }); 
    } 

    render() { 
    var fieldsArray = []; 

    for (var i = 0; i <= this.props.numToShow; i++) { 
     fieldsArray.push(
     <div> 
      <label> 
       <div className="label">{i}</div> 
       <input 
        type='text' 
        value={this.state.values[i]} 
        name={this.state.values[i]} 
        onChange={this.handleChange.bind(this, i)} /> 
      </label> 
     </div> 
    ); 
    } 

    return (
     <div className = 'inputs'> 
     {fieldsArray} 
     </div> 
    ); 
    } 
} 
+0

プログラムは、スプレッド演算子で行に失敗します。私はこの行が何をしているのかをさらに理解しようとしています。 this.state.valuesはすべての現在の状態値を保持し、[i]:e.target.valueは現在の入力の値をターゲット値に設定します(これはvalues [i]ではありません) スタックがサポートしていないかどうかわかりませんが、今後の調​​査では問題にはならないようです。 – user3745115

+1

おそらく、普及したオペレータにBabelが設定されていないことがあります。私はそれを使用している理由は、配列値が変更されただけで、新しいオブジェクトです。代わりにこれを試すことができます: 'var newValues = this.state.values.slice(); newValues [i] = e.target.value; this.setState({values:newValues}); ' – Jacob

+0

これはそのトリックでした。ありがとうございました! – user3745115

関連する問題