如何使用 redux 和 redux - Saga 在事件 onClick 上等待来自 API 的 reducer 更新数据?

How can I wait reducer update data from API on event onClick with redux and redux - Saga?

我正在努力解决这个问题,我真的需要一些帮助。这是我的工作流程: 在 onClick() 事件中,我启动了一个将数据对象传输到 reducer 和 reduxSaga 的操作。当调用 API 成功时,我使用 Redux Saga 中的 put() 函数使用 API 的响应更新状态。尽管每个操作似乎都是同步的,但我在第一次单击按钮时得到的是旧数据。这是我的代码,请查看并帮助我。

这是我的操作:

export const clickToDownloadExcelFile = (data) => ({
  type: constants.CLICK_TO_EXPORT_EXCEL_MERCHANT_LIST_FILE,
  data,
});

这是我的减速器:

case constants.CLICK_TO_EXPORT_EXCEL_MERCHANT_LIST_FILE:
      return { ...state };

    case constants.CLICK_TO_EXPORT_EXCEL_MERCHANT_LIST_FILE_SUCCESS:
      return { ...state, dataExcelFile: action.data };

    case constants.CLICK_TO_EXPORT_EXCEL_MERCHANT_LIST_FILE_FAILED:
      return { ...state };

这是我的传奇:

function* loadDataExportExcelMerchantList(actions) {
  try {
    const sendData = {
      feeCode: actions.data.feeCode,
      payChannel: actions.data.payChannel,
      typeSource: actions.data.typeSource,
      status: actions.data.status,
      merchantCode: actions.data.merchantCode,
      applyDate: actions.data.applyDate,
      expirationDate: actions.data.expirationDate,
      contract: actions.data.contract,
    };
    const data = yield call(apiFeeMerchantListExportExcel, sendData);
    yield put({
      type: constants.CLICK_TO_EXPORT_EXCEL_MERCHANT_LIST_FILE_SUCCESS,
      data,
    });
  } catch (error) {
    yield put({
      type: constants.CLICK_TO_EXPORT_EXCEL_MERCHANT_LIST_FILE_FAILED,
    });
  }
}

这是我的 onClick 函数:

exportFile = async () => {
    const { clickToDownloadExcelFile, dataSearch, dataExcelFile } = this.props;

    /**/ I start a action right here when I click on the button:**

    await clickToDownloadExcelFile(dataSearch);
     **// I want to get updated data from API in here. have any solution to do it?**
    console.log('dataExcelFile', dataExcelFile);

//第一次点击按钮,dataExcelFile为null(默认值)。在第二次点击时,detaExcelFile 是一个对象,我预计它会在第一次点击时显示。 };

takeLatest(constants.CLICK_TO_EXPORT_EXCEL_MERCHANT_LIST_FILE, loadDataExportExcelMerchantList),

我想因为我调用动作来调用 Api 和更新存储正好在侧 onClick(function) 之后显示 clickToDownLoadExcelFile 运行 和 api 需要一些时间来响应,它继续执行下一个代码而不等待,因此 dataExcelFile 的结果不会在第一次点击时更新。你有什么解决办法吗?

要等待 api 响应,请使用 componentDidUpdate 方法

componentDidUpdate(prevProps){
  if(prevProps.dataExcelFile != this.props.dataExcelFile){
    console.log(this.props.dataExcelFile)
  }
}

我遇到了同样的问题,并通过 return 想从操作中获取数据来解决。然后dispatch后直接拿到

const data = await clickToDownloadExcelFile(dataSearch);