dvajsはeffects非同期リクエスト後にcomponent stateを更新する方法
1841 ワード
この問題の原因を検討する.
componentコンポーネント内のimportには弾窓コンポーネントがあり、このコンポーネント内部のデータは非同期で取得する必要があります.もう1つのプロパティvisibleは、ポップアップウィンドウが表示されるかどうかを制御します.
ソリューション1: dva modelを使用して、visibleプロパティをmodel stateプロパティに設定します. effectでデータを取得すると、dispatchイベントがstate.visibleはtrue に設定
このシナリオに問題があります.
model state属性がインスタンス化された後は永遠に存在し、trueに設定すると、ページがジャンプしても、そのページに戻るとstate.visibleはtrueのままで、弾窓が現れるので、これは正しくありません.
実装コード:
ソリューション2:
visibleプロパティをcomponentのstateに設定し、effectsで取得したactionにcallbackメソッドを追加してcomponent state更新をトリガーします.
実装コード:
componentコンポーネント内のimportには弾窓コンポーネントがあり、このコンポーネント内部のデータは非同期で取得する必要があります.もう1つのプロパティvisibleは、ポップアップウィンドウが表示されるかどうかを制御します.
ソリューション1:
このシナリオに問題があります.
model state属性がインスタンス化された後は永遠に存在し、trueに設定すると、ページがジャンプしても、そのページに戻るとstate.visibleはtrueのままで、弾窓が現れるので、これは正しくありません.
実装コード:
export default {
namespace: 'organization',
state: {
visible: false,
},
effects: {
//
*getDetail({ payload }, { call, put }) {
const response = yield call(getDetail, payload);
yield put({
type: 'getDetailSuccess',
payload: response,
});
},
},
reducers: {
getDetailSuccess(state, action) {
return {
...state,
detail: action.payload,
visible: true,
};
},
},
};
ソリューション2:
visibleプロパティをcomponentのstateに設定し、effectsで取得したactionにcallbackメソッドを追加してcomponent state更新をトリガーします.
実装コード:
// models.js effect
*getDetail({ payload, callback }, { call, put }) {
const response = yield call(getDetail, payload);
// 。
if (response.success) {
if (callback && typeof callback === 'function') {
callback();
}
yield put({
type: 'getDetailSuccess',
payload: response,
});
}
},
// component.js dispatch
dispatch({
type: effects.getDetail,
payload: { id: record.id },
callback: () => {
this.setState({
detailVisible: true,
});
},
});