怎么解决React useEffect钩子带来的无限循环问题

发布时间:2022-07-07 13:51:35 作者:iii
来源:亿速云 阅读:492

本篇内容主要讲解“怎么解决React useEffect钩子带来的无限循环问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么解决React useEffect钩子带来的无限循环问题”吧!

React的useEffect Hook可以让用户处理应用程序的副作用。例如:

尽管useEffect Hook在React生态系统中很常见,但它需要时间来掌握。因此,许多新手开发人员在配置他们的useEffect函数时,会导致无限循环问题。在本文中,您将了解不同场景下带来的无限循环问题以及如何解决它们。

这是我们今天要学习的内容:

是什么导致无限循环以及如何解决它们:

什么导致的无限循环以及如何解决它们

在依赖项数组中不传递依赖项

如果您的useEffect函数不包含任何依赖项,则会出现一个无限循环。

例如,看看下面的代码:

function App() {
  const [count, setCount] = useState(0); //初始化值
  useEffect(() => {
    setCount((count) => count + 1); 
  }); //无依赖项
  return (
    <div className="App">
      <p> value of count: {count} </p>
    </div>
  );
}

如果没有依赖关系,则默认在每个更新周期上触发useEffect。因此,这里的应用程序将在每次渲染时执行setCount函数。因此,这会导致一个无限循环:

怎么解决React useEffect钩子带来的无限循环问题

是什么导致了这个问题?让我们一步一步来分析这个问题:

如何解决这个问题

为了缓解这个问题,我们必须使用依赖数组告诉React只有在特定值更新时才调用useEffect。

下一步,像这样附加一个空白数组作为依赖项:

useEffect(() => {
  setCount((count) => count + 1);
}, []); //empty array as second argument.

这告诉React在第一次装载时执行setCount函数。

怎么解决React useEffect钩子带来的无限循环问题

使用函数作为依赖项

如果你把一个方法传入你的useEffect依赖数组,React会抛出一个错误,表明你有一个无限循环:

function App() {
  const [count, setCount] = useState(0);

  function logResult() {
    return 2 + 2;
  }
  useEffect(() => {
    setCount((count) => count + 1);
  }, [logResult]); // 函数作为依赖项
  return (
    <div className="App">
      <p> value of count: {count} </p>
    </div>
  );
}

在这段代码中,我们将logResult方法传递给useEffect数组。理论上,React只需要在第一次渲染时增加count的值。

怎么解决React useEffect钩子带来的无限循环问题

是什么导致了这个问题?

如何解决这个问题

一个解决方案是使用useCallback钩子。这允许开发人员记住他们的函数,从而确保引用值保持不变。由于这个参考值是稳定的,React不应该无限地重新渲染UI:

const logResult = useCallback(() => {
  return 2 + 2;
}, []); // logResult是缓存的
useEffect(()=> {
  setCount((count)=> count+1);
},[logResult]); //没有无限循环错误,因为logResult引用保持不变。

结果:

怎么解决React useEffect钩子带来的无限循环问题

使用数组作为依赖项

将数组变量传递给依赖项也会运行一个无限循环。考虑下面的代码示例:

const [count, setCount] = useState(0); //初始值为0。
const myArray = ["one", "two", "three"];

useEffect(() => {
  setCount((count) => count + 1); // 和前面一样,增加Count的值
}, [myArray]); // 将数组变量传递给依赖项

在这个块中,我们将myArray变量传入依赖参数。

怎么解决React useEffect钩子带来的无限循环问题

是什么导致了这个问题?

既然myArray的值在整个程序中都没有改变,为什么我们的代码会多次触发useEffect ?

如何解决这个问题

为了解决这个问题,我们可以使用useRefHook这将返回一个可变对象,确保引用不会改变:

const [count, setCount] = useState(0);
//提取“current”属性并给它赋值
const { current: myArray } = useRef(["one", "two", "three"]);

useEffect(() => {
  setCount((count) => count + 1);
}, [myArray]); //依赖值是稳定的,所以没有无限循环

将对象作为依赖项传递

在useEffect依赖数组中使用对象也会导致无限循环问题。

考虑下面的代码:

const [count, setCount] = useState(0);
const person = { name: "Rue", age: 17 }; //创建一个对象
useEffect(() => {
  // 每次增加count的值
  // person的值发生了变化
  setCount((count) => count + 1);
}, [person]); // 依赖项数组包含一个对象作为参数
return (
  <div className="App">
    <p> Value of {count} </p>
  </div>
);

控制台的结果表明程序是无限循环的:

怎么解决React useEffect钩子带来的无限循环问题

是什么导致了这个问题?

如何解决这个问题

那么我们如何解决这个问题呢?

这就是usemmo的用武之地。**当依赖关系发生变化时,这个钩子会计算一个记忆的值。**除此之外,因为我们记住了一个变量,这确保了状态的引用值在每次渲染期间不会改变:

// 使用usemo创建一个对象
const person = useMemo(
  () => ({ name: "Rue", age: 17 }),
  [] //没有依赖关系,所以值不会改变
);
useEffect(() => {
  setCount((count) => count + 1);
}, [person]);

传递不正确的依赖项

如果将错误的变量传递给useEffect函数,React将抛出一个错误。

下面是一个简单的例子:

const [count, setCount] = useState(0);

useEffect(() => {
  setCount((count) => count + 1);
}, [count]); //注意,我们将count传递给了这个数组。

return (
  <div className="App">
    <button onClick={() => setCount((count) => count + 1)}>+</button>
    <p> Value of count{count} </p>
  </div>
);

怎么解决React useEffect钩子带来的无限循环问题

是什么导致了这个问题?

如何解决这个问题

要摆脱无限循环,只需像这样使用一个空的依赖数组:

const [count, setCount] = useState(0);
// 只有在组件首次挂载时才更新'count'的值
useEffect(() => {
  setCount((count) => count + 1);
}, []);

这将告诉React在第一次渲染时运行useEffect。

怎么解决React useEffect钩子带来的无限循环问题

到此,相信大家对“怎么解决React useEffect钩子带来的无限循环问题”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

推荐阅读:
  1. react重要的钩子
  2. 怎么解决element上传组件before-remove钩子问题

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

react useeffect

上一篇:如何通过Java代码实现Jetty的Http服务器

下一篇:Java效率提升神器jOOR怎么使用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》