useCallBack 和 useEffect 无限循环

2024-04-23

根据下面的代码,我需要在任何时候调用一个函数inView是真的,但是使用 useEffect and useCallback列出依赖项,我会导致无限循环。我设法避免它的唯一方法是不列出依赖项,但我收到一条警告,要求我列出它们。我只尝试过useEffect,但结果是相同的,列出了依赖项,我的循环有问题。这是代码:

import { useEffect, useCallback } from "react";
import { useInView } from "react-intersection-observer";

export const useLazyLoader = (onEnterView: () => void) => {
  const [ref, inView] = useInView({
    triggerOnce: true,
    rootMargin: "-200px",
  });

  const innerEnterView = useCallback(() => {
    onEnterView();
  }, [onEnterView]);

  useEffect(() => {
    inView && innerEnterView();
  }, [inView, innerEnterView]);
  return ref;
};

在此示例中,如果我删除任何依赖项以尝试避免该问题,我最终会收到如下警告:

Line 16:6:  React Hook useEffect has a missing dependency: 'innerEnterView'. Either include it or remove the dependency array  react-hooks/exhaustive-deps

无限循环的最可能原因是 onEnterView。为了确定这就是原因,请告诉我们该函数是在哪里创建的。 我认为发生的情况(我对此有 99.99% 的把握)是您在某个父级中创建了一个箭头函数(没有将其包装在 useCallback 中)。调用 onEnterView 会使父级重新渲染(你说你调用了调度),这也意味着 onEnterView 函数的引用将会改变。结果是每次调用 useLazyLoader 钩子时都会得到一个新的 onEnterView,因此你在那里的 useCallback 几乎没有用(每次都会得到不同的依赖项,因此他重新创建了 useCallback 结果)。要解决您的问题,请将 onEnterView 包装在定义的 useCallback 中,而不是使用它的位置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

useCallBack 和 useEffect 无限循环 的相关文章

随机推荐