2017-04-11 3 views
0

콜백 함수에서 전송 된 인수를 기반으로 동적으로 구성 요소 상태를 업데이트하려고합니다. 구성 요소가 valueChange('id', 1) ... this.state.contractLine.id1으로 업데이트되며 구성 요소가 보내는 경우 valueChange('innerLevel.name', 'newName')this.state.contractLine.innerLevel.namenewNameReactJS 상태를 동적으로 업데이트합니다.

에 업데이트됩니다 이것은 내가 사용하고 코드입니다 (하지만 그건 보내는 경우

그래서, 목표는 예상대로 작동하지 않음).

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

아이디어가 있으십니까?

편집 --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}); 
} 
관련 문제