2016-06-29 3 views
7

누군가가 반응-REDUX와 다음을 수행하는 방법에 대한 단서 나에게 줄 수 :redux에서 상태 변경에 응답하고 다른 작업을 파견하는 방법은 무엇입니까?

구성 요소 A가 상태를 업데이트하는 작업 (비동기)를 전달에게

구성 요소 B는 (A 아니 하위 구성 요소)에 필요 상태가 바뀌면 다른 행동을 파견 할 수 있어야합니다.

제 문제는 구성 요소 B에서 작업 2를 디스패치하려고 할 때 상태가 여전히 초기 상태이며 업데이트되지 않습니다. 두 번째 동작은도 (비동기도 등)의 상태를 업데이트하기 때문에

내가 또한 componentWillUpdate의 행동이 파견 시도했다, 그러나, 이것은 그것이 같은 모습입니다

무한 루프를 만들고 더 많거나 적은 :

당신의 돌아 오는 코드를 보지 않고
//----- Component A 
class ComponentA extends React.Component { 
    constructor(props) { 
    super(props); 
    this.props.dispatch(loadEvents()); // loadEvents is async and will update state.eventsState 
    } 
} 

const mapStateToProps = function (state) { 
    return { 
    eventsState: state.eventsState, 
    }; 
}; 

export default connect(mapStateToProps)(ComponentA); 


//----- Component B 
class ComponentA extends React.Component { 
    constructor(props) { 
    super(props); 
    props.dispatch(getEventUsers(props.eventsState.eventId)); // the eventsState is in initial state here (empty)...where do I call getEventUsers? 
    } 

    componentWillUpdate(nextProps) { 
    nextProps.dispatch(getEventUsers(props.eventsState.eventId)) // Creates an infinite loop, getEventUsers also updates state 
    } 
} 

const mapStateToProps = function (state) { 
    return { 
    eventsState: state.eventsState, 
    }; 
}; 

export default connect(mapStateToProps)(ComponentA); 
+0

구성 요소 B는로드 시작과로드 사이의 시간을 고려해야합니다. 회 전자 또는 아무것도 표시하지 않을 수 있습니다 (빈 div). 'loadEvents' 감속 기가 동기식이라하더라도 먼저 전달되도록 보장 할 수는 없습니다. React는'shouldComponentUpdate' 나 컴포넌트 생성자와 같은 다양한 함수를 호출 할 때 혼자 결정합니다. – DDS

답변

2

, 나는이 동시에 구성 요소에 대한 인스턴스화 되었기 때문에 구성 요소 B가 생성자에서 빈 데이터를 받고있다라고 말하고 싶지만, 그 시점에서 비동기 요청은 부품 A에 의해 시작 생성자가 아직 진행 중입니다.

비동기 요청이 완료되면 Redux가 수신 된 데이터가 포함 된 작업을 실행해야합니다. 그러면 감속기가이 데이터를 상태로 놓고 연결 된 구성 요소의 소품을 변경하고 강제로 다시 보냅니다.

props.eventState.eventId가 있고 변경된 경우에만 getEventUsers를 전달해야합니다.

+0

그건 의미가있어, 고마워! props.eventState.eventId가 있는지 확인하려면 어떻게합니까? 난 그냥 nextProps 비교 this.props componentWillUpdate에서? – mvovchak

+1

this.props와 nextProps를 비교할 때의 문제점은 eventUsers가 eventState에 포함되어있는 경우 사용자를로드 할 때 새로운 eventState 참조가 생기므로 이벤트가 같아도 eventUsers 다시 가져올 수 있습니다. ID를 비교하면 실제로 다른 이벤트를보고 있는지 확인할 수 있습니다. 어떤 시점에서 같은 이벤트에 대한 데이터를 다시로드하려는 경우 문제가 될 수 있습니다. 귀하의 상태를 표준화하는 것이 좋습니다 :로드 된 모든 사용자는 ID를 사용자 데이터에 매핑하는 별도의 개체에 보관 한 다음 이벤트 개체의 ID로 참조하십시오. –