使用Effect hook可以在函数组件中执行副作用
副作用
- data fetching
- setting up a subscription
- manually changing the DOM
- logging
useEffect
可以看作是 componentDidMount
, componentDidUpdate
和 componentWillUnmount
的结合,且useEffect
不会阻塞浏览器更新screen。
useEffect 使用方法及执行时机:
-
Effects Without Cleanup - 该例子会在每次
render
之后都执行effect
- 组建挂载后-
componentDidMount
- 每次
update
后-componentDidUpdate
- 组建挂载后-
useEffect(() => {
document.title = `You clicked ${count} times`;
})
-
Effects With Cleanup - 该例子的
effect
返回了一个函数- 其他内容在每次
render
之后会执行 - 返回的函数内容会在组件卸载之前(等同于
componentWillUnmount
)执行
- 其他内容在每次
useEffect(() => {
const handStatusUpdated = (status) => {
setIsOnline(status.isOnline)
}
ChatAPI.subscribe(friend.id, handStatusUpdated);
return ChatAPI.unsubscribe(friend.id, handStatusUpdated);
})
- 在同一个组件中多次使用
useEffect
- React会按照指定的顺序应用每个effect -
Skipping Effects - 只有
count
改变才会re-run
该effect
useEffect(() => {
document.title = `You clicked ${count} times`;
}, [count])
useEffect(() => {
const handStatusUpdated = (status) => {
setIsOnline(status.isOnline)
}
ChatAPI.subscribe(friend.id, handStatusUpdated);
return ChatAPI.unsubscribe(friend.id, handStatusUpdated);
}, [friend.id])
- 只在
mount
和unmount
时运行的effect
- 依赖项传入空数组
useEffect(() => {
// code block
}, [])
总结
学习useEffect
要理解什么是副作用以及使用useEffect
传入不同的参数时能达到什么效果。
对于effect
返回函数的情况可以单独进一步了解,该处并不仅仅是组件卸载时才会执行。
网友评论