【问题标题】:UseEffect async actionsUseEffect 异步操作
【发布时间】:2023-03-31 16:43:02
【问题描述】:

在我的 useEffect 挂钩中,我有一些 API 请求,例如:

useEffect(() => {
    dispatch(action1());
    dispatch(action2());
    dispatch(action3());
}, []);

如何在使用 async/await 函数的钩子中使用“加载”参数,以便在分派第一个请求之前加载为真,在分派最后一个请求后加载为假。 喜欢:

const [loading, setLoading] = useState(false);

useEffect(() => {
    setLoading(true);
    dispatch(action1());
    dispatch(action2());
    dispatch(action3());
    setLoading(false);
}, []);

【问题讨论】:

    标签: javascript reactjs async-await react-hooks


    【解决方案1】:

    我总是创建一个自定义钩子并将其用于 API 调用和 redux 调度。看看这可能会有所帮助。

    const useAction = () => {
      const dispatch = useDispatch();
      const [loading, setLoading] = useState(false);
    
      const fetchData = async (params) => {
        setLoading(true);
        try {
          // do something
          // await call api
          dispatch(action1());
          dispatch(action2());
          dispatch(action3());
        } catch (error) {
        } finally {
          setLoading(false);
        }
      };
    
      return { fetchData, loading };
    };
    
    // Component
    const { fetchData, loading } = useAction();
    useEffect(() => {
      fetchData(params);
    }, []);
    

    【讨论】:

      【解决方案2】:

      你可以这样做:

      const [loading, setLoading] = useState(false);
      
      useEffect(() => {
        async function fetchData() {
          setLoading(true);
          await dispatch(action1());
          await dispatch(action2());
          await dispatch(action3());
          setLoading(false);
        }
        fetchData()
      }, []);
      

      了解更多关于useEffectasyncReact Hook Warnings for async function in useEffect: useEffect function must return a cleanup function or nothing

      【讨论】:

      • awiat dispatch 实际上并没有等待在减速器上完成它的处理
      • @HagaiHarari 您必须配置您的调度程序才能这样做:您可以将所有内容包装成一个承诺。 stackoverflow.com/questions/41930443/…
      猜你喜欢
      • 2023-03-16
      • 1970-01-01
      • 2020-08-20
      • 2023-02-08
      • 2021-05-07
      • 2019-11-22
      • 2017-06-29
      • 2018-10-30
      • 1970-01-01
      相关资源
      最近更新 更多