gpt4 book ai didi

reactjs - useCallBack 和 useEffect 无限循环

转载 作者:行者123 更新时间:2023-12-05 02:04:46 24 4
gpt4 key购买 nike

根据下面的代码,只要 inView 为真,我就需要调用一个函数,但是使用 useEffectuseCallback 列出依赖关系,我造成无限循环。我设法避免它的唯一方法是不列出依赖项,但我得到一个警告,我必须列出它们。我只尝试使用 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 会使父级重新呈现(你说你调用了 dispatch),这也意味着 onEnterView 函数的引用将会改变。结果是你每次调用 useLazyLoader 钩子(Hook)时都会得到一个新的 onEnterView,所以你在那里的 useCallback 几乎没有用(你每次都会得到不同的依赖,所以他重新创建了 useCallback 结果)。要解决您的问题,请将 onEnterView 包装在定义的 useCallback 中,而不是使用它的地方。

关于reactjs - useCallBack 和 useEffect 无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64104731/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com