2017-04-11 3 views
0

Ich versuche, einen Komponentenstatus dynamisch zu aktualisieren, basierend auf den Argumenten, die für eine Rückruffunktion gesendet werden.ReactJS Aktualisierungsstatus dynamisch

So ist es das Ziel, wenn die Komponente sendet valueChange('id', 1) ... this.state.contractLine.id wird 1 aktualisiert werden, und wenn die Komponente sendet valueChange('innerLevel.name', 'newName')this.state.contractLine.innerLevel.name wird

Dies ist der Code zu newName aktualisiert ich verwende (aber es ist funktioniert nicht wie erwartet).

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); 
} 

Irgendwelche Ideen?

EDIT --SOLVED--

Nur falls jemand das gleiche Problem hat ... ich @rauliyohmc Rat gefolgt und schaffte es, das Problem mit lodash zu lösen. Der verwendete Code (viel einfacher, als ich je gedacht) war:

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

    _.set(newState, statePath, inputValue); 

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

Ihr Code schnell zu betrachten, scheint es, dass Sie den Zustand mutieren. Der Schuldige ist 'var newState = this.state', was bewirkt, dass 'newState' auf die gleiche Objektreferenz verweist. Wenn Sie also 'newState [' contractLine '] = stateBeingChanged' ausführen, mutieren Sie 'this.state'. Stattdessen "var newState = Object.assign ({}, this.state)" vor dem Erzeugen des neuen Objekts. Lass es mich wissen, wenn das hilft – rauliyohmc

Antwort

0

Nur falls jemand das gleiche Problem hat ... ich @rauliyohmc Rat gefolgt und schaffte es, das Problem mit lodash zu lösen. Der verwendete Code (viel einfacher als ich jemals dachte) war:

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

    _.set(newState, statePath, inputValue); 

    this.setState({contractLine: newState}); 
} 
Verwandte Themen