副作用
纯函数是没有副作用,相同的输入会有相同的输出。
而副作用可以概括为
- 引用外部变量
- 调用外部函数
React 中的副作用是针对于组件渲染时,不使用到的变量和操作就是副作用。
- 修改 DOM
- 修改全局变量
- ajax
- 计时器
- 存储相关
…
和外部变量的交互
使用 useEffect 就是对副作用操作
渲染后执行
useEffect 相当在类组件中是使用 componetDidMount
和 componentDidUpdate
这两个生命周期钩子中做了一个简单合拼的操作。
会在真实 DOM 构建之后(渲染后)会执行 useEffect 的回调函数,其执行方式是异步的。
如果在 DOM 构建之前可以使用 useLayoutEffect
清理 effect
回调函数可以返回一个函数,用于清除副作用的回调。相当于类组件使用 componentWillUnmount
useEffect(() => {
return () => {
// 清理 effect
}
})
清理 effect 的回调执行会在第首次渲染后(componentDidUpdate
)的 effect 回调执行前执行。即 componentDidMount
不会执行清理 effect,之后每次执行 useEffect 的回调(componentDidUpdate
)时先执行清理 effect。
当组件要被销毁时(componentWillUnmount
)也会被执行清理 effect。
依赖项
当依赖项为 undefined 时,相当于类组件设置了 componentDidMount
、componentDidUpdate
、componentWillUnmount
(设置了清理 effect 的话)
依赖项为 []
空数组时,effect 只会执行一次 componentDidMount
、componentWillUnmount
- 如果在这样设置后,在 effect 中 setState 时只会拿到 useState 的默认值
- 这时可以使用
setState((val)=>val++)
回调函数的方式来设置
关注点分离使用自定义 hooks
const useCount = (param) => {
const [count, setCount] = useState(param);
useEffect(() => {
setCount((count) => count++);
}, []);
return [count, setCount];
}