useEffect

168 阅读2分钟

useEffect

1,副作用

谈useEffect之前先要说明副作用(side effect)是什么?
副作用是函数式编程的一个概念,所以与react hook相关。
与副作用相对应的是 “纯函数”,纯函数是指,与函数传入的参数息息相关,返回固定结果的函数,如:

function fn(a,b){return a+b} //这就是一个纯函数
fn(2,4)得到的一定是6,不改变其余东西

一言以蔽之:相同的输入一定会有相同的输出。
而副作用会改变全局变量
只要函数和外界存在交互,都可以认为是不纯

let a = 3;
function fn(b) {a = a+b;return a} //这就改变了全局变量

副作用包括了:

  • 修改全局变量值 document
  • 发送ajax请求
  • console.log
  • 修改出传入的参数
  • 计时器
  • 存储相关
  • ...

2,useEffect

真实DOM的构建是在componentdidmount和componentdidupdate之后的事情; useeEffect的回调函数是在真实DOM构建以后执行的。 第二个参数是空数组时,表示没有东西可以进行比较是否更新,则代表与上次比较的结果相同,所以副作用的逻辑就只执行1次。
第二个参数为空数组,保证了副作用只在组件挂载和组件卸载的时候执行,不在组件更新的时候执行。 有依赖项时,当依赖项不一致时,会重新执行。

  • useEffect里的函数是个闭包。
  • useEffect里的回调函数里return一个函数,这个函数是清理函数注意,这个clear在执行回调函数本身之前执行。

image.png 即,除了第一次渲染只输出“useEffect”外,以后每次渲染,先输出“clear Effect”再输出“useEffect”。

  • 同时这个清理函数会在组件销毁时执行。
  • 每一次副作用函数,都是个不同的函数。