useEffect

977 阅读2分钟

useEffect

对比之前React class

useEffectReact class
useEffectcomponentDidMount
useEffectcomponentDidUpdate
useEffect (<尝试卸载不会执行>)componentWillUnmount

useEffect 做了什么

告诉 React 组件需要在渲染后执行某些操作

为什么在组件内部调用useEffect

可以在effect内部直接访问state变量、或者props,而不用添加特殊的api来读取它,state(props)已经保存在函数的作用域中。hooks引入了javascript的闭包机制。

useEffect 会在每次选然后都执行? {是的}

默认情况下,effect在第一次渲染和每次更新后都会执行(下面会说如何控制它执行的时机) react保证每次运行effect的时候,DOM都已经更新完毕

effect执行时机(性能优化)

每次渲染渲染都执行effect会有性能问题,effect传入第二个参数

useEffect(() => {
    console.log('hello world')
}, [count]) \\当count改变时effect函数才会重新执行

第二个参数可以有多个,里面的任意一个发生改变都会触发effect函数的重新执行

推荐使用 eslint-plugin-react-hooks 中的 exhaustive-deps 规则

如果第二个参数为空数组,则只执行一次

每个effect函数都属于一次特定的渲染。

  • 每次重新渲染都会生成新的effect,替换掉之前的,确保effect中获取的值是最新的,不用担心过期。
  • useEffect调度不会阻塞浏览器更新屏幕<异步>。(多数情况下effect不需要同步进行) 个别情况下(获取布局信息的情况下,单独提供useLayoutEffect使用<它会在所有的 DOM 变更之后同步调用 effect>)

需要清除的effect (防止内存泄露)

effect函数返回一个函数 react将会在执行清除操作的时候调用它。effect的清除机制

React 何时清除 effect?

React 会在组件卸载的时候执行清除操作(React 会在执行当前 effect 之前对上一个 effect 进行清除)