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のままで、弾窓が現れるので、これは正しくありません.
    実装コード:
    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,
            });
          },
        });