1.useEffect是什么?
副作用鉤子:用于處理組件中的副作用,用來取代生命周期函數(shù)。
useEffect(()=>{//副作用函數(shù)
return ()=>{ // 返回函數(shù)
}
},[依賴參數(shù)])
2.useEffect可以做什么?
- 掛載階段:
從上向下執(zhí)行函數(shù),如果碰到 useEffect 就執(zhí)行并將 useEffect 傳入的副作用函數(shù)推入一個隊列(鏈表),在組件掛載完成之后,將隊列(鏈表)中的副作用函數(shù)執(zhí)行,并將副作用函數(shù)的返還函數(shù),推入一個新的隊列(鏈表) - 更新階段 - !!! 更新階段不同于其他階段對應的函數(shù)是否要執(zhí)行,取決于依賴參數(shù):
從上向下執(zhí)行函數(shù),如果碰到 useEffect 就執(zhí)行并將 useEffect 傳入的副作用函數(shù)推入一個隊列(鏈表),在組件更新完成之后,找出之前的返回函數(shù)隊列,依次準備執(zhí)行,在執(zhí)行前會判斷該 useEffect 的依賴參數(shù),如果依賴參數(shù)改變就執(zhí)行,否則跳過當前項去看下一項,然后再執(zhí)行副作用隊列,執(zhí)行時同樣判斷依賴是否變化,來決定其是否執(zhí)行,如果執(zhí)行,就重新獲取其對應的返回函數(shù)。 - 卸載階段:
組件即將卸載時,找出其對應的返回函數(shù)隊列,依次執(zhí)行
3.常規(guī)處理副作用的幾種情況:
依賴參數(shù)不同時有不同的效果:
為空: 組件的任何更新,該 useEffect 對應的返回函數(shù)和函數(shù)都執(zhí)行
為空數(shù)組: 不監(jiān)聽組件的更新
數(shù)組中有具體依賴:對應的依賴數(shù)據(jù),有變化的時候,才會執(zhí)行
- 組件掛載完之后做某事
useEffect(()=>{
console.log("組件掛載完之后執(zhí)行");
return ()=>{
}
},[]);
- 組件掛載完成及更新完成做某事
useEffect(()=>{
console.log("組件掛載完成之后及更新完成之后執(zhí)行");
})
- 組件更新完做某事
const isMounted = useRef(false);
useEffect(()=>{
if(isMounted.current){
console.log("組件更新完成")
} else {
isMounted.current = true;
}
})
- 組件即將卸載做某事
useEffect(()=>{
return ()=>{
console.log("組件即將卸載時執(zhí)行");
}
},[]);