react学习笔记(14) - hooks(2) - useEffect()
useEffect(回调函数,[依赖项])
- 官方文档
- 我们可以认为,
useEffect()是一个监视函数,它能够帮助我们再组件挂载的时候执行对应的回调函数或者再我们想要监视的变量变化时执行对应的回调函数。
useEffect可以做什么?(模拟生命周期)
- 挂载阶段:
- 从上向下执行函数,如果碰到
useEffect就执行并将useEffect传入的副作用函数推入一个队列(链表),在组件挂载完成之后,将队列(链表)中的副作用函数执行,并将副作用函数的返还函数,推入一个新的队列(链表)
- 从上向下执行函数,如果碰到
- 更新阶段
- 更新阶段不同于其他阶段对应的函数是否要执行,取决于依赖参数
- 从上向下执行函数,如果碰到
useEffect就执行并将useEffect传入的副作用函数推入一个队列(链表),在组件更新完成之后,找出之前的返回函数队列,依次准备执行,在执行前会判断该useEffect的依赖参数,如果依赖参数改变就执行,否则跳过当前项去看下一项,然后再执行副作用队列,执行时同样判断依赖是否变化,来决定其是否执行,如果执行,就重新获取其对应的返回函数。
- 卸载阶段:
- 组件即将卸载时,找出其对应的返回函数队列,依次执行!
常规处理副作用的几种情况:
依赖参数不同时有不同的效果:
- 为空: 组件的任何更新,该
useEffect对应的返回函数和副作用函数都执行- 为空数组: 不监听组件的更新
- 数组中有具体依赖:对应的依赖数据,有变化的时候,才会执行
useEffect()的三种使用方法:
// 1. 每次更新之后都要执行 |
上面提到的返回函数又称清理函数,它的执行时机为:在组件卸载时以及下一次副作用函数调用之前执行,由此,我们就可以使用useEffect()来模拟生命周期函数,如componentWillUnmount
// 相当于componentWillUnmount,组件销毁时执行 |
不仅如此我们还可以模拟各种各样的生命周期函数
- 组件挂载完之后做某事(
componentDidMounted)
useEffect(()=>{ |
- 组件挂载完成及更新完成做某事(
componentDidUpdate)
useEffect(()=>{ |
- 组件更新完做某事(
componentDidUpdate)
const isMounted = useRef(false); |
- 组件即将卸载做某事(
componentWillUnmount)
useEffect(()=>{ |
案例展示:
- 使用
useEffect重塑上面生命周期的案例: 父组件给子组件提供数据,子组件接收后,渐变展示(定时器),父组件点击销毁子组件后子组件消失,同时关闭定时器
// hooks - useEffect(()=>{副作用函数内容,返回函数},[依赖]) |
结果展示:

useEffect和useLayoutEffect有什么区别?
简单来说就是调用时机不同, useLayoutEffect 和原来 componentDidMount & componentDidUpdate 一致,在react完成DOM更新后马上同步调用的代码,会阻塞页面渲染。而useEffect 是会在整个页面渲染完才会调用的代码。官方建议是优先使用useEffect,
在实际使用时如果想避免页面抖动(在useEffect 里修改DOM很有可能出现)的话,可以把需要操作DOM的代码放在useLayoutEffect 里。在这里做点dom操作,这些dom修改会和 react 做出的更改一起被一次性渲染到屏幕上,只有一次回流、重绘的代价。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0许可协议。转载请注明来自 肥林の仓库




