参考代码
import React, { useEffect, useState } from 'react'
import { Link } from 'react-router-dom'
function Demo() {
const [count, setCount] = useState(0)
useEffect(() => {
console.log('无依赖---------------------------', count)
return () => {
console.log('执行 无依赖 时的return的函数')
}
})
useEffect(() => {
console.log('依赖为[]------------------------', count)
return () => {
console.log('执行 依赖为[] 时的return的函数')
}
}, [])
useEffect(() => {
console.log('依赖为[count]------------------------', count)
return () => {
console.log('执行 依赖为[count] 时的return的函数')
}
}, [count])
return (
<div>
<p>count的值为: {count} </p>
<button onClick={() => setCount(count + 1)}>add</button>
<Link to="/management">About</Link>
</div>
)
}
初次加载页面结果如下
可以看到首次组件加载时,return 都没有执行
修改依赖项之后
修改依赖项会先执行无依赖和依赖的 return,再执行 return 之外的,没有执行依赖项为空数组的情况。
跳转路由之后
可以看到路由跳转时,三种情况的 return 都执行了
总结
- 首次加载不会执行 return
- 当 useEffect 被再次执行时会先清理副作用执行 return,再执行 return 之外的,可以理解为只要 useEffect 被再次执行,都会执行 return
- 当组件销毁时,不管是否有依赖项,useEffect 的 return 都会被执行去清理副作用
代码参考:useEffect有依赖项和没有依赖项时return内外的代码执行顺序_useeffect return-CSDN博客
react版本: "^18.2.0"