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在执行回调函数本身之前执行。
即,除了第一次渲染只输出“useEffect”外,以后每次渲染,先输出“clear Effect”再输出“useEffect”。
- 同时这个清理函数会在组件销毁时执行。
- 每一次副作用函数,都是个不同的函数。