2016-06-29 9 views
7

誰かが私に反応し、Reduxので次の操作を行う方法についての手がかりを与えることができます:reduxの状態変更に対応して、別のアクションをディスパッチする方法はありますか?

成分Aは、状態(非同期)を更新するアクションをディスパッチする

成分B(Aのない子コンポーネントが)する必要があります状態が変化したときを検出して、別のアクションをディスパッチすることができます。

私の問題は、コンポーネントBでディスパッチアクション2を実行しようとすると、状態はまだ初期状態であり、更新されません。

私も2番目のアクションも(非同期にも及び)状態を更新するため、しかし、それは無限ループを作成し、componentWillUpdateでアクション2を派遣しようとしている

これは、多かれ少なかれ、どのように見えるかです:

//----- 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

Reduxコードを見ていないと、コンポーネントAがほぼ同時にインスタンス化され、その時点でコンポーネントAによって開始された非同期要求であるため、コンポーネントBがコンストラクタで空のデータを取得していると思いますコンストラクタはまだ進行中です。

Reduxは、非同期要求が完了したときに受信したデータを含むアクションを起動する必要があります。あなたのレデューサーは、このデータを状態にして、接続されたコンポーネントの小道具を変更し、それらを再レンダリングさせます。

props.eventState.eventIdが存在し、変更された場合にのみ、getEventUsersを送出する必要があります。

+0

それは感謝します、ありがとう! props.eventState.eventIdが存在することをどのように確認しますか? nextPropsとcomponentWillUpdateのthis.propsを比較すればよいですか? – mvovchak

+1

this.propsとnextPropsを単に比較するときの問題は、eventUsersがeventStateに含まれていると、ユーザーを読み込むときに新しいeventState参照が取得されるため、イベントが同じでもeventUsers再度フェッチされます。 IDを比較することで、あなたが本当に別のイベントを見ていることを確認できます。これは、ある時点で同じイベントのデータをリロードする場合に問題になる可能性があります。あなたの状態を正規化することをお勧めします。ロードされたすべてのユーザーを、IDをユーザーデータにマッピングする別々のオブジェクトに保管し、イベントオブジェクトのIDで参照します。 –

関連する問題