首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >useCallBack和useEffect无限循环

useCallBack和useEffect无限循环
EN

Stack Overflow用户
提问于 2020-09-28 23:01:44
回答 1查看 949关注 0票数 1

根据下面的代码,每当inView为true时,我都需要调用一个函数,但是使用useEffectuseCallback列出依赖项时,我会导致无限循环。我设法避免它的唯一方法是不列出依赖项,但我得到了一个警告,我必须列出它们。我只尝试了useEffect,但结果是一样的,列出了依赖项,我在循环中遇到了问题。代码如下:

代码语言:javascript
复制
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;
};

在这个例子中,如果我删除了任何依赖项来避免这个问题,我最终得到如下的警告:

代码语言:javascript
复制
Line 16:6:  React Hook useEffect has a missing dependency: 'innerEnterView'. Either include it or remove the dependency array  react-hooks/exhaustive-deps
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-29 04:23:15

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64104731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档