成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

useEffect與useLayoutEffect

yibinnn / 2374人閱讀

摘要:當(dāng)某個(gè)無(wú)狀態(tài)組件要在某個(gè)階段執(zhí)行這些鉤子,它會(huì)優(yōu)先執(zhí)行清理函數(shù)再執(zhí)行初始函數(shù)。并且發(fā)現(xiàn)的函數(shù)會(huì)在最后才執(zhí)行,它會(huì)晚于包含它的父函數(shù)。當(dāng)目前還是實(shí)驗(yàn)性質(zhì),不排除會(huì)改變。不好用,不像那么明顯可以與有狀態(tài)組件的生命周期鉤子相對(duì)應(yīng)。

React Hook讓無(wú)狀態(tài)組件擁有了許多只有有狀態(tài)組件的能力,如自更新能力(setState,使用useState),訪問(wèn)ref(使用useRef或useImperativeMethods),訪問(wèn)context(使用useContext),使用更高級(jí)的setState設(shè)置(useReducer),及進(jìn)行類似生命周期的階段性方法(useEffect或useLayoutEffect)。

當(dāng)然還有一些Hook,帶來(lái)了一些新功能,如useCallback,這是對(duì)事件句柄進(jìn)行緩存,useState的第二個(gè)返回值是dispatch,但是每次都是返回新的,使用useCallback,可以讓它使用上次的函數(shù)。在虛擬DOM更新過(guò)程中,如果事件句柄相同,那么就不用每次都進(jìn)行removeEventListner與addEventListner。最后就是useMemo,取得上次緩存的數(shù)據(jù),它可以說(shuō)是useCallback的另一種形式。

useState: setState 
useReducer: setState
useRef: ref
useImperativeMethods: ref
useContext: context
useCallback:可以對(duì)setState的優(yōu)化
useMemo: useCallback的變形
useLayoutEffect:類似componentDidMount/Update, componentWillUnmount
useEffect: 類似于setState(state, cb)中的cb,總是在整個(gè)更新周期的最后才執(zhí)行

從上面的描述來(lái)看useEffect的時(shí)期是非常晚,可以保證頁(yè)面是穩(wěn)定下來(lái)再做事情。但是useEffect與useLayoutEffect與有狀態(tài)組件的生命周期鉤子又有一點(diǎn)不一樣。

useEffect(function(){
  //dosomething
  return function(){
  //dosomething     
  }
 }, inputs)

useEffect與useLayoutEffect的第一個(gè)參數(shù)是一個(gè)函數(shù)(初始函數(shù)),這函數(shù)還會(huì)返回另一個(gè)清理用的函數(shù)(清理函數(shù),在官方文檔中沒(méi)有明確的文字,都注釋使用了clean up的字眼,就姑且這樣叫)。當(dāng)某個(gè)無(wú)狀態(tài)組件要在某個(gè)階段執(zhí)行這些鉤子,它會(huì)優(yōu)先執(zhí)行清理函數(shù)再執(zhí)行初始函數(shù)。




  
  

   
   
   



    

初次渲染的界面與日志

如果我們向input輸入內(nèi)容,就會(huì)發(fā)現(xiàn)它每次都會(huì)先進(jìn)行 useEffect與useLayout的清理函數(shù),再執(zhí)行他們的初始函數(shù)。并且發(fā)現(xiàn)useEffect的函數(shù)會(huì)在最后才執(zhí)行,它會(huì)晚于包含它的父函數(shù)。我們可以點(diǎn)擊頁(yè)面上的h1標(biāo)簽,就可以證明這一點(diǎn)。

點(diǎn)擊h1會(huì)不斷遞增數(shù)字,到10時(shí)會(huì)銷(xiāo)供Example這個(gè)無(wú)狀態(tài)組件與它的子組件Child。下面是數(shù)字到10時(shí)的界面與日志。

在我的迷你React框架中是這樣實(shí)現(xiàn)這兩個(gè)鉤子

export function useEffect(create, inputs) {
    return dispatcher.useEffect(create, inputs, PASSIVE, "passive", "unpassive");
}
export function useLayoutEffect(create, inputs) {
    return dispatcher.useEffect(create, inputs, HOOK, "layout", "unlayout");
}
export var dispatcher = {
    //略...
    useEffect(create, inputs, EffectTag, createList, destoryList) {
        let fiber = getCurrentFiber();
        let cb = dispatcher.useCallbackOrMemo(create, inputs);
        if (fiber.effectTag % EffectTag) {
            fiber.effectTag *= EffectTag;
        }
        let updateQueue = fiber.updateQueue;
        let list = updateQueue[createList] ||  (updateQueue[createList] = []);
        updateQueue[destoryList] ||  (updateQueue[destoryList] = []);
        list.push(cb);
    },
    //略...
};

它們就是執(zhí)行時(shí)機(jī)不一樣。

當(dāng)目前React Hook還是實(shí)驗(yàn)性質(zhì),不排除會(huì)改變。目前有9種鉤子,其實(shí)之前有十種,useMutationEffect前不久已經(jīng)完蛋了。useMemo與useCallback很相近,但覺(jué)得useMemo的使用場(chǎng)合很少,不知它會(huì)不會(huì)廢掉。useEffect不好用,不像useLayoutEffect那么明顯可以與有狀態(tài)組件的生命周期鉤子相對(duì)應(yīng)。useImperativeMethods這個(gè)名字起得不好,可能以后也會(huì)調(diào)整。當(dāng)然這只是我的看法。

React Hook是一個(gè)很棒的設(shè)計(jì),它其實(shí)是將有狀態(tài)組件的更新機(jī)制(setState/forceUpdate)的內(nèi)部實(shí)現(xiàn)進(jìn)行了更廣泛的應(yīng)用。當(dāng)它的API穩(wěn)定下來(lái)我會(huì)與大家分享它們更深層次的實(shí)現(xiàn)。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/100330.html

相關(guān)文章

  • 十個(gè)案例學(xué)會(huì) React Hooks

    摘要:在線傳遞給的是而不是,返回值即是想要透?jìng)鞯臄?shù)據(jù)了。所以函數(shù)組件在每次渲染的時(shí)候如果有傳遞函數(shù)的話都會(huì)重渲染子組件。在學(xué)會(huì)使用React Hooks之前,可以先看一下相關(guān)原理學(xué)習(xí)React Hooks 前言 在 React 的世界中,有容器組件和 UI 組件之分,在 React Hooks 出現(xiàn)之前,UI 組件我們可以使用函數(shù),無(wú)狀態(tài)組件來(lái)展示 UI,而對(duì)于容器組件,函數(shù)組件就顯得無(wú)能為力,我...

    williamwen1986 評(píng)論0 收藏0
  • 03. 該嘗嘗React Hook了。

    摘要:我們統(tǒng)一把這些操作稱為副作用,或者簡(jiǎn)稱為作用。盡可能使用標(biāo)準(zhǔn)的以避免阻塞視覺(jué)更新。大多數(shù)情況下,不需要同步地執(zhí)行。返回的對(duì)象在組件的整個(gè)生命周期內(nèi)保持不變。當(dāng)對(duì)象內(nèi)容發(fā)生變化時(shí),并不會(huì)通知你。 Hook Hook 是 React 16.8.0 的新增特性。 Hook 使你在非 class 的情況下可以使用更多的 React 特性。Hook 不能在 class 組件中使用。 使用規(guī)則: ...

    cikenerd 評(píng)論0 收藏0
  • 如何用ahooks控制時(shí)機(jī)的hook?

      本篇主要和大家溝通關(guān)于ahooks ,我們可以理解為加深對(duì) React hooks 的了解?! ∥覀兿日f(shuō)下關(guān)于抽象自定義 hooks。構(gòu)建屬于自己的 React hooks 工具庫(kù)?! ∑鋵?shí)我們應(yīng)該培養(yǎng)閱讀學(xué)習(xí)源碼的習(xí)慣,工具庫(kù)是一個(gè)對(duì)源碼閱讀不錯(cuò)的選擇?! ∽ⅲ罕鞠盗袑?duì) ahooks 的源碼解析是基于v3.3.13?! ‖F(xiàn)在就進(jìn)入主題用ahooks 來(lái)封裝 React要注意的時(shí)機(jī)?  Fun...

    3403771864 評(píng)論0 收藏0
  • react hooks 全面轉(zhuǎn)換攻略(二) react本篇剩余 api

    摘要:不知道大家有沒(méi)有使用過(guò)他的作用和中的差不多吧在需要讀取的高度寬度的時(shí)候特別需要說(shuō)到現(xiàn)在基本已經(jīng)講完了除了我將會(huì)放在篇中講述相關(guān)文章全面轉(zhuǎn)換攻略一本篇之全面轉(zhuǎn)換攻略二本篇剩余全面轉(zhuǎn)換攻略三全局存儲(chǔ)解決方案 useCallback,useMemo 因?yàn)檫@兩個(gè) api 的作用是一樣的,所以我放在一起講; 語(yǔ)法: function useMemo(factory: () => T, deps:...

    molyzzx 評(píng)論0 收藏0
  • 解讀useEvent顯著降低Hooks負(fù)擔(dān)的原生Hook

      想要做到就要有更多的學(xué)習(xí),你知道為什么React不把他們?cè)O(shè)為默認(rèn)方法#useEvent是一個(gè)剛剛提案的原生Hook,還處于RFC。現(xiàn)在我們就一起來(lái)討論下  RFC:Request for Comments 提案應(yīng)用的還十分廣泛  我們先看看在沒(méi)有 useEvent 會(huì)出現(xiàn)的情況:  functionChat(){   const[text,setText]=useState(''...

    3403771864 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<