2017-05-06 3 views
1

redux 저장소가 올바르게 업데이트되지만 구성 요소에 변경 내용이 반영되지 않는 문제를 추적했습니다. 저는 여러 가지 방법으로 국가를 돌연변이시키지 않았지만 문제는 지속됩니다.()를 호출 나는 보통 Object.assign를 중첩 사용, 내 copyState 기능에 대한JSON.parse (JSON.stringify (state))는 redux 상태의 변이를 보장하지 않습니까?

case 'ADD_OBJECT_TO_OBJECT_OF_OBJECTS': { 
    newState = copyState(state); 
    newState.objectOfObjects[action.id] = action.obj; 
    return newState; 
} 

하지만 오류를 방지하는 것은 그렇게 간단하지 않다 : 내 감속기는 일반적으로 형태를 취한다. 테스트를 위해, 나는 상태를 돌연변이 아니에요 확인하기 위해, 관계없이 프로세스가 얼마나 비싼 (REDUX) 상태를 돌연변이하지의 보장 방법으로

const copyState = (state) => { 
    return JSON.parse(JSON.stringify(state)); 
}; 

를 사용하는 것이 맞습니까?

그렇지 않은 경우 상태를 변경하지 않기 위해 의존 할 수있는 다른 딥 복사 방법이 있습니까?

편집 : 다른 사람들이 동일한 문제를 겪고있는 것을 고려해 볼 때, 나는 그 문제에 대한 해결책을 전달할 것입니다.

조치를 파견하려고 시도한 후 라인에서 이전 행에서 갱신 된 상점의 데이터에 액세스하려고했습니다.

dispatchAction(data) // let's say this updates a part of the redux state called 'collection' 
console.log(this.props.collection) // This will not be updated! 

https://github.com/reactjs/redux/issues/1543

+0

'state' 줄 수 있습니다 (그러나 믿을 수 없을만큼 바보) 것'copyState' –

+0

에 그대로있을 것'을 변이합니다'.toJSON' 방법을 state'. – Bergi

답변

0

참조 예이 깊은 복제에 관계없이 그것이 얼마나 비싼 않습니다. 어려움 (질문 아래 언급에서 암시 됨)은 state이 다른 곳의 모든 곳에서 그대로 유지되는지 확인하는 것입니다.

다른 접근법을 요구하고 의견에 맞지 않을 것이므로 ImmutableJS을 살펴보고 상태 변이 추적 버그 문제를 해결할 것을 제안합니다.

const { Map } = require('immutable') 
const map1 = Map({ a: 1, b: 2, c: 3 }) 
const map2 = map1.set('b', 50) 
map1.get('b') // 2 
map2.get('b') // 50 
+0

해답을 가져 주셔서 감사합니다. 그러나 나는 redux의 근본적인 오해가 없는지 확인하고 싶습니다. 당신은 '다른 곳의 상태를 유지하라'고 언급했다. 테스트 할 때마다 모든 단일 감속기에서이 JSON.parse() 접근 방식을 사용했습니다. 여전히 저장소가 올바르게 업데이트되지만 (미들웨어는 작업 발송 후 'nextState'에 변경 사항을 표시 함) 구성 요소가 이러한 변경 사항을 반영하지 않습니다. 이 문제는 돌연변이가 아닌 상태를 요구하는 것이 아니라는 것을 의미합니까, 아니면 copyState의 구현에서 redux가 어떻게 작동하는지에 대해 오해하고 있습니까? – underscore

+0

이용 가능한 정보가 있으면 나는 오해하지 않는다고 생각한다. 나는 또한 내가 빠져 있지 않기를 바란다. 나는 또한 redux에 관한 초보자이지만, 당신의'copyState' 함수가 그것의 공연). 그래서 문제는 다른 곳에있는 것 같습니다 : / –