【问题标题】:react useEffect hook infinite loop caused by axios cancel token [react-hooks/exhaustive-deps]由axios取消令牌引起的react useEffect hook无限循环[react-hooks/exhaustive-deps]
【发布时间】:2020-03-03 04:21:52
【问题描述】:

在我的 React 组件中,我使用 useEffect 来获取组件安装以及每次过滤器更改时的数据。一切正常,但react-hooks/exhaustive-deps 会抛出警告,指出 fetcher 函数应该在依赖项数组中。通过将 fetcher 添加到依赖项列表,应用程序进入无限循环。 fetcher 在每次运行时都会收到一个新的 Axios 取消令牌,这会导致对 fetcher 的调用无限循环。 在不禁用规则的情况下,我应该如何处理这种情况?

他的 fetcher 函数在 useEffect 之外,导致另一个回调函数(传递给孩子)可能会调用 fetcher。例如可以编辑用户并在成功编辑时调用 fetcher 以重新加载新用户的模式

const [isLoading, setIsLoading] = React.useState<boolean>(false);
const [users, setUsers] = React.useState<IUser[]>([]);
const [filters, setFilters] = React.useState<ITableFilters>({...initFilters});

const fetcher = async (s: CancelTokenSource): Promise<void> => {
    setIsLoading(true);
    const params = { ...filters };
    try {
      const { data} = await fetchAllUsers({
        params,
        cancelToken: s.token
      });
      setUsers(data.users);
      setIsLoading(false);
    } catch (error) {
      handleResponseError(error);// wchich checks axios.isCancel
      setIsLoading(false);
    }
}

  React.useEffect(() => {
    const source = axios.CancelToken.source();
    // tslint:disable-next-line: no-floating-promises
    fetcher(source);
    return function cleanup() {
      source.cancel();
    };
  }, [filters]);

【问题讨论】:

    标签: reactjs axios react-hooks use-effect


    【解决方案1】:

    您可以使用useCallback,因此对fetcher 的引用应该保持不变,不会导致更多的重新渲染。

    const fetcher = useCallback(async (s: CancelTokenSource) => {
      setIsLoading(true);
      const params = { ...filters };
      try {
        const { data} = await fetchAllUsers({
          params,
          cancelToken: s.token
        });
        setUsers(data.users);
        setIsLoading(false);
      } catch (error) {
        handleResponseError(error);// wchich checks axios.isCancel
        setIsLoading(false);
      }
    }, [setIsLoading, setUsers, filters])
    

    【讨论】:

    • 我还应该补充一点; useEffect 的依赖关系也应该包含在useCallback 的依赖关系中。就我而言,它是filters
    • @Amir-Mousavi 正确,我错过了。
    猜你喜欢
    • 2020-11-20
    • 1970-01-01
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    • 2020-09-06
    • 2020-05-01
    • 2021-06-10
    • 2019-08-15
    相关资源
    最近更新 更多