Skip to main content

useEffect

如果你熟悉 React class 的生命周期函数,你可以把 useEffect Hook 看做 componentDidMountcomponentDidUpdatecomponentWillUnmount 这三个函数的组合。

基础示例

Live Editor
Result
Loading...

组件挂载执行

当第2个参数为空数组 [] 时,初始化调用一次之后将不再执行,相当于 componentDidMount

useEffect(() => {
console.log('只打印1次')
}, [])

数据更新执行

import React, { useState, useEffect } from "react"

function Example() {
const [count, setCount] = useState(0)

useEffect(() => {
document.title = `您点击了 ${count}`
}, [count])

return (
<div>
<p>您点击了 {count}</p>
<Button variant="outlined" onClick={() => setCount(count + 1)}>
点击
</Button>
</div>
)
}

上面这个示例中,我们传入 [count] 作为第二个参数。这个参数是什么作用呢?如果 count 的值是 5,而且我们的组件重渲染的时候 count 还是等于 5,React 将对前一次渲染的 [5] 和后一次渲染的 [5] 进行比较。因为数组中的所有元素都是相等的(5 === 5),React 会跳过这个 effect,这就实现了性能的优化。

当渲染时,如果 count 的值更新成了 6,React 将会把前一次渲染时的数组 [5] 和这次渲染的数组 [6] 中的元素进行对比。这次因为 5 !== 6,React 就会再次调用 effect。如果数组中有多个元素,即使只有一个元素发生变化,React 也会执行 effect。

组件卸载执行

useEffect(() => {
console.log('我每次都执行')     

// componentWillUnMount
return () => {
// 卸载前处理,如:清除定时器、socket连接、web存储等
}
})

更新全局Store

useEffect(() => {
// ...
}, [
global.time,
global.count
])