2017-04-11 16 views
0

コールバック関数で送信された引数に基づいてコンポーネントの状態を動的に更新しようとしています。ReactJSの状態を動的に更新する

ので、部品がvalueChange('id', 1)を送信する場合の目標はある... this.state.contractLine.id1に更新され、コンポーネントが送信した場合valueChange('innerLevel.name', 'newName')this.state.contractLine.innerLevel.nameこれは私が使用しているコードです(それはだnewName

に更新されます期待どおりに働かない)。

valueChange(statePath, inputValue) { 
    var newState = this.state; 

    var stateBeingChanged = this.state['contractLine']; 

    var pathList = statePath.split('.'); 
     for (var i = 0; i < pathList.length; i++) { 
      var elem = pathList[i]; 
      stateBeingChanged = stateBeingChanged[elem]; 
     } 

    stateBeingChanged = inputValue; 

    newState['contractLine'] = stateBeingChanged; 

    this.setState(newState); 
} 

EDIT --SOLVED--私は@rauliyohmcアドバイスに従い、lodashの問題を解決するために管理し、誰かが同じ問題を抱えているだけの場合には

...

。 (私が今まで思ったよりもはるかに簡単な)使用 コードはでした:

valueChange(statePath, inputValue) { 
    var newState = Object.assign({}, this.state['contractLine']); 

    _.set(newState, statePath, inputValue); 

    this.setState({contractLine: newState}); 
} 
+3

すぐにあなたのコードを見て、それはあなたが状態を突然変異させているようです。原因は、 'newState = this.state'であり、' newState'を同じオブジェクト参照に指定するという効果があります。したがって、 'newState ['contractLine'] = stateBeingChanged'を実行すると、あなたは' this.state'に突然変異を起こしています。代わりに、新しいオブジェクトを生成する前に 'var newState = Object.assign({}、this.state)'を実行してください。それが役に立ったら教えてください – rauliyohmc

答えて

0

念の誰かが同じ問題を抱えている...私は@rauliyohmcアドバイスに従い、lodashの問題を解決するために管理しました。使用されたコード(私が思っていたよりもはるかに簡単でした):

valueChange(statePath, inputValue) { 
    var newState = Object.assign({}, this.state['contractLine']); 

    _.set(newState, statePath, inputValue); 

    this.setState({contractLine: newState}); 
} 
関連する問題