引起 useEffect 钩子 无限循环的原因分析

本文详细解释了在ReactuseEffect钩子中可能导致无限循环的五种情况:不传递依赖项、改变状态作为依赖项、函数依赖项、数组和对象依赖项。提供了使用useCallback、useMemo和useRef等钩子来解决循环问题的策略。
摘要由CSDN通过智能技术生成

引起 useEffect 钩子无限循环的操作有:

1、不传递依赖项,并在useEffect中执行改变某些状态
2、在useEffect中执行改变某个状态,并把这个状态作为依赖项
3、使用函数作为依赖项,并在useEffect中执行改变某些状态
4、使用数组作为依赖项,并在useEffect中执行改变某些状态
5、使用对象作为依赖项,并在useEffect中执行改变某些状态

下面进行逐个举例分析

1、不传递依赖项,并在useEffect中执行改变某些状态

循环示例

在这里插入图片描述

导致循环的原因分析:
首次渲染时,会触发useEffect,useEffect执行setCount,setCount改变了count的值
不传递依赖项,任何状态更新都会执行useEffect,所以count被改变了又触发了useEffect陷入了循环。

解决方案:

空数组作为依赖项,首次渲染时执行
在这里插入图片描述

2、在useEffect中执行改变某个状态,并把这个状态作为依赖项

循环示例

在这里插入图片描述

导致循环的原因分析:
首次渲染时,会触发useEffect,useEffect执行setCount,setCount改变了count的值
count作为依赖项,count状态更新则依赖项改变了,又触发了useEffect陷入了循环。

解决方案:

空数组作为依赖项,首次渲染时执行
在这里插入图片描述

3、使用函数作为依赖项,并在useEffect中执行改变某些状态

循环示例

在这里插入图片描述

导致循环的原因分析:
首次渲染时,会触发useEffect,useEffect执行setCount,setCount改变了count的值
状态改变会导致重新渲染组件,重新渲染组件会导致函数Fn的引用会被重新定义,引用不同则useEffect依赖项发生改变,所以触发了useEffect,陷入了循环。

解决方案:

使用useCallback钩子,重新渲染组件时,获取缓存中函数Fn的引用,依赖项仍是原来的引用,阻止了循环。
在这里插入图片描述

4、使用数组作为依赖项,并在useEffect中执行改变某些状态

循环示例

在这里插入图片描述

导致循环的原因分析:
首次渲染时,会触发useEffect,useEffect执行setCount,setCount改变了count的值
状态改变会导致重新渲染组件,重新渲染组件会导致数组arr的引用会被重新定义,引用不同则useEffect依赖项发生改变,所以触发了useEffect,陷入了循环。

解决方案1:

使用useMemo钩子,重新渲染组件时,获取缓存中数组arr的引用,依赖项仍是原来的引用,阻止了循环。
在这里插入图片描述

解决方案2:

使用useRef钩子,useRef 创建出来的对象始终都是最开始的那个对象,重新渲染组件时,依赖项仍是原来的数组arr,阻止了循环。
在这里插入图片描述

5、使用对象作为依赖项,并在useEffect中执行改变某些状态

循环示例

在这里插入图片描述

导致循环的原因分析:
首次渲染时,会触发useEffect,useEffect执行setCount,setCount改变了count的值
状态改变会导致重新渲染组件,重新渲染组件会导致对象obj的引用会被重新定义,引用不同则useEffect依赖项发生改变,所以触发了useEffect,陷入了循环。

解决方案1:

使用useMemo钩子,重新渲染组件时,获取缓存中对象obj的引用,依赖项仍是原来的引用,阻止了循环。
在这里插入图片描述

解决方案2:

使用useRef钩子,useRef 创建出来的对象始终都是最开始的那个对象,重新渲染组件时,依赖项仍是原来的对象obj,阻止了循环。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值