React Hook


零、動(dòng)機(jī)

? ? 1、在組件之間復(fù)用狀態(tài)邏輯很難,React 需要為共享狀態(tài)邏輯提供更好的原生途徑

? ? 2、復(fù)雜組件變得難以理解,生命周期內(nèi)同一個(gè)函數(shù)內(nèi)部的操作,可能有獲取數(shù)據(jù),訂閱變動(dòng)等不相關(guān)的邏輯

? ? 3、難以理解的 class,JavaScript 中?this?的工作方式

PS:hook在class不起作用,帶有hook的函數(shù)組件跟class是一樣的,可以取代class

一、useState

? ? 需要定義成響應(yīng)式的變量,都需要useState聲明,這是函數(shù)組件內(nèi)部的狀態(tài)變量,

? ? 不能在if里面,為函數(shù)組件提供了自己的狀態(tài)變量,

? ??一般來說,在函數(shù)退出后變量就會(huì)”消失”,而 state 中的變量會(huì)被 React 保留

二、useEffect? ? ? ??

? ? 執(zhí)行時(shí)機(jī):在瀏覽器完成布局與繪制之后

? ??componentDidMount:會(huì)在組件掛載后(插入 DOM 樹中)立即調(diào)用

? ??componentDidUpdate:會(huì)在更新后會(huì)被立即調(diào)用

? ? 銷毀:return的函數(shù)會(huì)在組件即將銷毀時(shí)(componentWillUnmount)調(diào)用,effect 的清除階段在每次重新渲染(render)之前都會(huì)執(zhí)行,而不是只在即將卸載組件的時(shí)候執(zhí)行一次

? ? useEffect接受兩個(gè)參數(shù),第一個(gè)effect,第二個(gè)是依賴,useEffect會(huì)在瀏覽器渲染完成,對(duì)比依賴項(xiàng)是否改變,再執(zhí)行effect

????所以u(píng)esEffect可以當(dāng)做componentDidMount,?componentDidUpdate,?componentWillUnmount的結(jié)合

? ? useEffect默認(rèn)每次重新渲染(render后)都執(zhí)行

1、阻止每次渲染都執(zhí)行

????????useEffect(effect, [value])?

? ? ? ? 以上,在每次組件重新渲染的時(shí)候,useEffect會(huì)判斷value是不是變了,如果沒變,就會(huì)跳過effect

2、僅在掛載和卸載的時(shí)候執(zhí)行? ? ??

????useEffect(() => {? // do something? return 'doing'}, [])? ? ??

3、僅在掛載的時(shí)候執(zhí)行

????useEffect(effect)

三、useContext

? ? 跨組件層級(jí)數(shù)據(jù)獲取

? ??<MyContext.Provider>?的 value 發(fā)生變化時(shí)候, 調(diào)用了?useContext?的組件總會(huì)在變化時(shí)重新渲染

四、useCallback

? ? ? ? 返回緩存的函數(shù)

useCallback(fn,? deps)?相當(dāng)于?useMemo(() => fn,? deps)。

? ? 當(dāng)一個(gè)函數(shù)被傳遞給,經(jīng)過使用引用相等性去避免非必要渲染的子組件時(shí),會(huì)很有用,子組件校驗(yàn)函數(shù)是否變化

五、useMemo

????返回緩存的值(類似于vue 的 computed) ,其他屬性同上,傳入useMemo的函數(shù)會(huì)在渲染期間執(zhí)行,不要在函數(shù)內(nèi)執(zhí)行與渲染無關(guān)的操作?

? ? 意思就是,dom render的時(shí)候,每次都先執(zhí)行useMemo,之后整合好最新的dom,在交給瀏覽器渲染

? ? 但是主要是用來,在return的dom中使用的變量(包括傳入子組件的),每次在state變得時(shí)候,在進(jìn)行渲染,期間,用到的函數(shù)和變量,會(huì)不分好壞,都執(zhí)行一遍,所以,為了避免重復(fù)工作,用useMemo或者useCallback,來使用緩存,提高性能

六、useRef

? ??useRef?返回一個(gè)可變的 ref 對(duì)象,其 current?屬性被初始化為傳入的參數(shù)(initialValue)。返回的 ref 對(duì)象在組件的整個(gè)生命周期內(nèi)保持不變,類似于組件內(nèi)的全局變量。useRef?會(huì)在每次渲染時(shí)返回同一個(gè) ref 對(duì)象。變更?.current?屬性不會(huì)引發(fā)組件重新渲染

七、useLayoutEffect

? ??它會(huì)在所有的 DOM 變更之后同步調(diào)用 effect??梢允褂盟鼇碜x取 DOM 布局并同步觸發(fā)重渲染,也就是,DOM變更之后 且 渲染之前,會(huì)阻塞瀏覽器繪制。

? ? 跟useEffect一樣,只是調(diào)用時(shí)機(jī)不一樣

八、useImperativeHandle

? ??可以讓你在使用?ref?時(shí)自定義暴露給父組件的實(shí)例值

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容