網站首頁 編程語言 正文
useEffect 介紹
如果你熟悉 React class 的生命周期函數,你可以把 useEffect Hook 看做
componentDidMount,componentDidUpdate 和 componentWillUnmount 這三個函數的組合。
- componentDidMount 組件掛載
- componentDidUpdate 組件更新
- componentWillUnmount 組件將要摧毀
使用方法
情況一:
useEffect需要傳遞兩個參數,第一個參數是邏輯處理函數,第二個參數是一個數組
代碼如下:
useEffect(() => {
/** 執行邏輯 */
},[])
情況二:
- 第二個參數存放變量,當數組存放變量發生改變時,第一個參數,邏輯處理函數將會被執行
- 第二個參數可以不傳,不會報錯,但瀏覽器會無限循環執行邏輯處理函數。
代碼如下:
useEffect(() => {
/** 執行邏輯 */
})
情況三:
第二個參數如果只傳一個空數組,邏輯處理函數里面的邏輯只會在組件掛載時執行一次 ,等價于 componentDidMount
代碼如下:
useEffect(() => {
/** 執行邏輯 */
},[])
情況四:
- 第二個參數如果不為空數組,依賴指定參數觸發使用
- 邏輯處理函數會在組件掛載時執行一次和(a或者b變量在棧中的值發生改變時執行一次) 這是不是相當于componentDidMount 和componentDidUpdate 的結合
const [a, setA] = useState(1);
const [b, setB] = useState(2);
useEffect(() => {
/** 執行邏輯 */
},[a,b])
情況五:
- useEffect第一個參數可以返回一個回調函數,這個回調函數將會在組件被摧毀之前和再一次觸發更新時,將之前的副作用清除掉。這就相當于componentWillUnmount。
- useEffect去除副作用。我們可能會在組件即將被掛載的時候創建一些不斷循環的訂閱(計時器,或者遞歸循環)。在組件被摧毀之前,或者依賴數組的元素更新后,應該將這些訂閱也給摧毀掉。
比如以下的情況(沒有去除計時器,增大不必要的開銷和代碼風險)
const [time, setTime] = useState(0)
useEffect(() => {
const InterVal = setInterval(() => {
setTime(time + 1)
},1000)
},[])
處理在組件被摧毀前去除計時器
const [time, setTime] = useState(0)
useEffect(() => {
const InterVal = setInterval(() => {
setTime(time + 1)
},1000)
return () => {
clearInterval(InterVal )
}
},[])
特殊情況處理
useEffect監測不到依賴數組元素的變化。
只有一種可能,依賴數組元素的地址的值根本就沒變,
原因:因為changeA沒有真正的改變a在棧中的值(地址的值),只是改變了a在堆中的值。
useEffect監測不到堆中值得變化,所有引用類型數據都應該注意這一點。
代碼示例:
const [a, setA] = useState({
b: 'dx',
c: '18',
})
const changeA = () => {
setA((old) => {
old.b = 'yx'
return old
})
}
useEffect(() => {
/** 當組件掛載時執行一次changeA */
changeA ()
},[])
/**當changeA執行卻沒有打印 a*/
useEffect(() => {
/** 執行邏輯 */
console.log(a)
},[a])
解決的辦法
const [a, setA] = useState({
b: 'dx',
c: '18',
})
const changeA = () => {
setA((old) => {
const newA = {...old}
newA .b = 'yx'
return newA
})
}
useEffect(() => {
/** 當組件掛載時執行一次changeA */
changeA ()
},[])
/**當changeA執行打印 {b:'yx',c:'18'} */
useEffect(() => {
/** 執行邏輯 */
console.log(a)
},[a])
原文鏈接:https://blog.csdn.net/weixin_50636536/article/details/128379079
相關推薦
- 2022-06-01 React函數式組件與類組件的不同你知道嗎_React
- 2022-11-08 切換tab時,van-list中的onload事件沒觸發
- 2022-07-13 Atom 常用快捷鍵
- 2022-02-23 關于zabbix自定義監控項和觸發器問題_zabbix
- 2022-10-31 Kotlin標準庫函數使用分析及介紹_Android
- 2023-01-15 Android傳感器使用實例介紹_Android
- 2022-11-19 Python教程之無限迭代器的使用詳解_python
- 2022-06-01 詳解Python中sorted()和sort()的使用與區別_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支