【问题标题】:Await not working in useEffect with redux等待在 redux 中无法使用 useEffect
【发布时间】:2020-06-18 03:27:34
【问题描述】:

我正在尝试从 API 获取一些数据并在我的 redux 存储中设置数据。但是,当我尝试对 redux 存储中的数据进行一些操作时,该变量为空。我用过 await 但它似乎不起作用。但是,在 useEffect 之后,redux store(api data) 数据是可见的并且可以对其进行操作。任何帮助表示赞赏。 请注意,我需要访问 redux 存储字段,而不仅仅是从函数中获取返回的数据。访问 redux 存储字段很重要。这是我的代码:

useEffect(() => {
    async function loadData() {
      const startingDateYear = moment();
      const eventDates = generateDatesForYear(startingDateYear.year().toString());
      await dispatch(fetchData('0009', eventDates[0], eventDates[1]));
    }
    loadData();
    console.log(event.myDataArray) // event is a reducer and myDataArray is the field. It can be accessed outside the function with data incorporated but within useEffect I am not able to use the freshly fetched data.
    return {};
  }, []);


 export const fetchData = (p1, p2, p3) => {
  return async dispatch => {
    const path = `dataFromAPIURL`;
    try {
      dispatch({
        type: FETCH_STARTED,
      });

      const myDataArray = await RestService.get(path);
      dispatch({
        type: FETCH_FINISHED,
      });

      dispatch({
        type: UPDATE_REDUCER_STATE,
        payload: myDataArray,
      });

      return myDataArray;
    } catch (error) {
      // TODO: error handling
      dispatch({ type: FETCH_ERROR, payload: error });
    }
  };
};

【问题讨论】:

  • 您将 loadData 定义为异步函数,但您没有使用 await 调用它
  • 即使我在那里使用 await 并使 useEffect Async 它仍然不起作用,因为我需要访问 redux 存储字段。是的,使 useEffect async 在这一点上似乎不是最优雅的解决方案。

标签: reactjs react-redux react-hooks


【解决方案1】:

你需要第二个 useEffect 依赖 event.myDataArray

useEffect(() => {
  async function loadData() {
    const startingDateYear = moment();
    const eventDates = generateDatesForYear(startingDateYear.year().toString());
    await dispatch(fetchData("0009", eventDates[0], eventDates[1]));
  }
  loadData();
}, []);

useEffect(() => {
  console.log(event.myDataArray);
}, [event.myDataArray]);

【讨论】:

  • 它确实有效,但为什么我需要第二个 useEffect?因为我只需要等待我的调度完成,等待就足够了吗?
  • 我的 useEffect 更像是组件确实挂载了,添加第二个效果会使事情变得更复杂,因为我认为不需要它。
  • 如果我们可以像以前那样使用一个 useEffect 来实现 Compnent Did Mount 吗?
  • @HassanAbbas 你不能在第一个useEffect中直接访问,这就是useEffect的本质。
  • @HassanAbbas 你可以在docs了解更多信息
猜你喜欢
  • 2021-03-21
  • 2020-11-15
  • 1970-01-01
  • 1970-01-01
  • 2020-12-03
  • 2019-01-27
  • 2017-08-19
  • 2019-04-25
  • 2018-03-26
相关资源
最近更新 更多