2016-08-04 5 views
2

Redux를 사용하여 저장소를 관리하는 ReactJs 앱이 있습니다. 제 주정부는 복잡한 파일을 보관할 수있는 복잡한 json입니다. 내가 감속기를 시작할 때, 서버에서 컨텐트를 가져 오기 전에 액세스 할 때 다른 초기 상태를 지정해야합니다. 'undefined'오류가 발생합니다. 다음은 예입니다 초기 상태는 redux로 연결되지 않았습니다. 반응 앱

fetchContent() 나던이 시점에서 호출 할 것 때문에 처음 구성 요소의 처음 상태는, state.reducer1.a.b.c이 정의가 발생 지금

//Test.jsx 
 
class Test extends React.Component{ 
 
    componentWillMount(){ 
 
     fetchContent({ 
 
     type: SET_CONTENT 
 
     }); 
 
    } 
 
    render(){ 
 
     return(
 
     <div> {this.props.header} </div> 
 
    ) 
 
    } 
 
    mapStateToProps(state){ 
 
     return{ 
 
     header: state.reducer1.a.b.c 
 
     } 
 
    } 
 
} 
 
export default (mapStateToProps)(Test); 
 

 

 
//reducer1.js 
 
export default function reducer1(state = {}, action = {}) { 
 
    switch (action.type) { 
 
    case SET_CONTENT: 
 
     return Object.assign({}, action.data); 
 
    default: 
 
     return state; 
 
    } 
 
} 
 
    
 
//reducer2.js 
 
export default function reducer2(state = {}, action = {}) { 
 
    switch (action.type) { 
 
    case SET_SOMETHING_ELSE: 
 
     return Object.assign({}, action.data); 
 
    default: 
 
     return state; 
 
    } 
 
} 
 
    
 
//CombinedReducer.js 
 
export default combinedReducers(Object.assign({}, {reducer1}, {reducer2}))

.

제 질문은 어떻게 해결합니까? 감속기의 초기 상태를 지정하는 것이 유일한 옵션입니까? 다음과 같은

//reducer1.js 
 
export default function reducer1(state = { a: { b: { c: "somedata"}}}, action = {}) { 
 
    switch (action.type) { 
 
    case SET_CONTENT: 
 
     return Object.assign({}, action.data); 
 
    default: 
 
     return state; 
 
    } 
 
}

답변

0

당신 그렇게하지만, 당신은 또한 단지 첫 번째 키의 존재를 확인하기 위해 mapState 기능을 업데이트 할 수 있습니다. , 당신이 파견 누락

class C { 
    ... 
} 

function mapStateToProps (state) {} 

connect(mapStateToProps)(C) 

마지막으로 : 당신이 connect에 전달하고 구성 요소에 특정하지 함수의로

function mapStateToProps(state){ 
    return{ 
    header: state.reducer1.a ? state.reducer1.a.b.c : <div>Loading..</div> 
    } 
} 

또한 난 당신이 클래스 정의의 mapStateToProps 외부를 의미 가정 fetchContent 전화가 왔습니까? 이것은 redux-thunk를 사용하고 있습니까?

+0

그래서 유일하게 가능한 솔루션 중 하나는 내가했던 것처럼 상태를 lnitialize 또는 상태에서 데이터 액세스의 각 수준에 null 검사를 할 경우! 예, 기능이 바깥에 있어야했습니다.이 글을 빨리 작성 했으므로 제대로 살펴 보지 않았습니다. 그리고 예, fetchContent는 내부적으로 dispatch를 호출하는 액션 생성자의 함수입니다. – user3807940

+0

null 체크를 할 무언가에 대한 귀하의 기대가 무엇인지 확신 할 수 없습니까? 당신은 정말로 단지 a) predata와 b) 데이터를 점검 할 두 가지 상태가 있습니다. 이것은 '모든 수준의 데이터 액세스'가 아니라 단지 하나의 null 체크입니다. – azium

0

대부분의 경우 모든 응답 데이터를 축소기에 저장하지 않아야합니다. 상태 계층 구조는 JSON 응답의 계층 구조를 반복해서는 안됩니다.

그것은 나를 더 간단 감속기 만 c 변수를 저장하는 것입니다 :

//reducer1.js 

export default function reducer1(state = { c: undefined }, action) { 
    switch (action.type) { 
    case SET_CONTENT: 
     return Object.assign({}, state, { c: action.data.a.b.c }); 
    default: 
     return state; 
    } 
} 

을 또한, 당신은 당신의 코드에서 몇 가지 실수가 있습니다

기능은 클래스 의 외부에서 정의되어야한다
  • mapStateToProps
  • fetchContent 함수를 직접 호출하는 대신 결과를 전달해야합니다.
// Test.jsx 

class Test extends React.Component{ 
    componentWillMount(){ 
    dispatch(fetchContent({ 
     type: SET_CONTENT 
    })); 
    } 

    render() { 
    const { header } = this.props; 
    return header ? (
     <div>{header}</div> 
    ) : (
     <div>Loading...</div> 
    ); 
    } 
} 

function mapStateToProps(state) { 
    return { 
    header: state.reducer1.c 
    } 
} 

export default (mapStateToProps)(Test); 
+0

redux-store는 단순한 json 만 저장해야한다는 의미입니까? 서버의 응답이 복잡하고 깊게 중첩 된 json 인 경우에도 redux-store에 저장하기 전에 간단한 1 레벨 json으로 변환해야합니다. 또한 코드 실수에 관해서는 입력 오류였습니다. 클래스 정의 외부에 mapStateToProps를 가지고 싶었고 내 fetchContent는 내부적으로 디스패치를 ​​사용하는 작업 작성자 중 하나의 함수입니다. – user3807940

+0

@ user3807940, 그것은 상황에 달려 있습니다. 서버에서 json을 깊이 중첩 시키려면'normalizr' 패키지 사용을 고려하십시오. 깊은 중첩 된 json을 1 레벨 데이터로 변환하는 데 사용됩니다. – 1ven

+0

아, 시끄럽다, 전에 normalizr에 대해 들었지만 결코 그것을 시도하지 마십시오. 그때 큰 소리로 말할 것입니다! 답장을 보내 주셔서 감사합니다 :) – user3807940

관련 문제