精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

從源碼理清 UseEffect 第二個參數是怎么處理的

開發 前端
useEffect 第二個參數傳入 undefined、[]、[a,b,c] 時執行的效果不同, undefined 每次都會執行,而依賴數組只有在依賴變了才會執行,空數組只會執行一次。

useEffect 是常用的 hook,它支持兩個參數,第一個參數是回調函數,第二個參數是依賴。

當第二個參數為 null 或 undefined 的時候,回調函數每次 render 都會執行,而參數為數組的時候,只有依賴項變了才會執行。

這些我們都很熟悉了,但它是怎么實現的呢?我們來從源碼來找下答案。

useEffect 的第二個參數

我們先來試一下第二個參數傳入 undefined、空數組、有依賴的數組時的效果。

準備這樣一段代碼:

import { useEffect, useRef, useState } from 'react';

function Dong() {
const ref = useRef(1);
const [,setState] = useState();
useEffect(() => {
console.log(111);
});
useEffect(() => {
console.log(222);
}, []);
useEffect(() => {
console.log(333);
}, [ref.current]);
useEffect(() => {
setInterval(() => {
setState([]);
}, 1000);
setTimeout(() => {
ref.current = 2;
}, 3000);
}, []);
return <div>dong</div>;
}

我們用寫了三個 useEffect,第二個參數分別為 undefined、[]、有一個依賴的數組,回調函數里分別打印 111、222、333。

然后 useState 聲明了一個 state,用 setInterval 定時修改,這樣能不斷觸發 render。

又用 useRef 聲明了一個對象,它的特點是每次 render 都是返回的同一個對象,我們用 setTimeout 在 2s 后修改了它的值。

執行的結果大家應該很容易想到:

111 每次都會打印,因為第二個參數為 undefined。

222 只打印一次,因為第二個參數為 []。

333 打印兩次,因為第二個參數有一個依賴,這個依賴在 2s 的時候會變一次。

這些我們都很熟悉了,但是它為什么是這樣呢?

我們來看下源碼:

useEffect 相關源碼

react hooks 的原理前面一篇文章寫過,我們再過一遍:

jsx 編譯產生 render function,執行返回 vdom,但是為了提高性能,React 16 引入 fiber 架構,會先把 vdom 轉成 fiber,然后再去更新到 dom。

vdom 轉 fiber 的過程叫做 reconcile,更新到 dom 的過程叫做 commit。reconcile 的過程是可打斷的,需要 schedule。

hooks 也是基于 fiber 來實現的,它在 fiber 節點上維護了一個鏈表(memorizedState 屬性),用來保存數據,每個 hook 都是從對應的鏈表元素上存取各自的數據。

比如上面那個組件的 6 個 hook 就對應著 fiber 節點上 memorizedState 鏈表的 6 個元素:

每個 hook 都是在對應的鏈表元素上存取數據的。

這個鏈表有個建立的過程,叫做 mount,后面只需要 update,所以每個 hook 的實現都會分為 mount 和 update 兩個階段。

我們看下 useEffect 相關的源碼:

它也是分為了 mountEffect 和 updateEffect 兩個函數,最終都是在 hook.memorizedState 存取元素的。這就是 hook 的通用原理。

第二個參數對應的就是 deps,它是怎么判斷是否要更新的呢?

我們著重看下這段邏輯:

deps 是新傳入的參數,如果是 undefined 會作為 null。

hook.memorizedState.deps 取到的是之前的 deps。

然后新舊 deps 會做下對比,如果返回 true 才會執行 effect。

對比的邏輯在 areHookInputsEqual 這個函數里:

如果 prevDeps 是 null,那就直接返回 false,這就是 useEffect 第二個參數傳 undefined 或者 null 的話 effect 函數都會執行的原因。

否則,才會新舊的 deps 數組中每個元素做對比,有一個不一樣就返回 false。

這已經解釋了上面那個案例,deps 數組傳 undefined、[]、[dep] 時 effect 執行的不同情況。

其實還有一種情況也會導致 effect 執行,就是上面這段邏輯:

當熱更新的時候,就算依賴沒有變,也需要重新執行 effect,這個是通過 ignorePreviousDependencies 變量來控制的。

這個估計很多人都不知道,因為熱更新是工具實現的。

我們從源碼層面解釋清楚了 useEffect 第二個參數的處理機制。

其實 useCallback、useMemo 的 deps 參數處理邏輯也是一樣的,源碼都差不多:

總結

useEffect 第二個參數傳入 undefined、[]、[a,b,c] 時執行的效果不同, undefined 每次都會執行,而依賴數組只有在依賴變了才會執行,空數組只會執行一次。

我們從源碼層面解釋了原因:

hooks 是在 fiber 節點的 memorizedState 屬性上存取數據的,會組織一個和 hook 一一對應的鏈表。

構建這個鏈表的階段叫 mount,后面只需要 update,所以所有的 hook 的實現都分為了 mountXxx 和 updateXxx 兩部分。

useEffect 在 update 時會對比新傳入的 deps 和之前存在 memorizedState 上的 deps 來確定是否執行 effect 回調,它做了這樣的處理:

當 dep 是 null(undefined 也會處理成 null)時,判定為不相等。如果是熱更新的時候,判定為不相等。否則會對比數組的每個依賴項來判斷是否相等。只要新舊 deps 不相等就執行 effect。

useCallback、useMemo 的 deps 處理也是一樣的,我們從源碼層面理清楚了 deps 參數的處理機制。

責任編輯:姜華 來源: 神光的編程秘籍
相關推薦

2023-11-26 17:59:00

React組件參數

2020-09-11 10:27:07

鴻蒙安卓操作系統

2011-05-23 10:16:25

VMware微軟

2009-11-05 09:54:03

盜版黨歐洲議會

2016-07-07 13:20:43

阿里云計算yunos

2011-09-21 13:09:33

HTML 5

2022-05-18 10:26:21

微軟Linux穩定版

2011-11-01 10:21:16

UbuntuAndroid

2011-02-18 14:04:27

Ubuntu 10.0

2010-10-25 06:33:43

戴爾dell虛擬化

2009-02-09 09:13:13

Windows 7BetaUAC

2015-08-12 11:35:32

Windows 10Windows 8

2010-10-08 11:29:45

AndroidiPhone

2012-05-07 23:41:43

JavaJVMCeylon

2021-05-17 18:56:20

甲骨文云區域

2022-03-26 09:39:53

SOC運營數據

2020-11-27 18:06:36

Python 開發編程語言

2017-05-17 06:34:18

Android谷歌

2019-06-19 09:00:33

驅動器安裝Windows 10
點贊
收藏

51CTO技術棧公眾號

欧美一区二区三区在线观看视频 | 人妻精品久久久久中文字幕69| www.亚洲资源| 极品少妇一区二区| 午夜精品www| 久久久久久久毛片| 三级欧美日韩| 一本大道综合伊人精品热热| 日本成人性视频| 无码h黄肉3d动漫在线观看| 蜜桃91丨九色丨蝌蚪91桃色| 欧美大学生性色视频| 亚洲一区二区三区蜜桃| 日韩不卡在线视频| 91国产成人在线| 国产成人一二三区| www.亚洲.com| 成人avav在线| 91在线观看欧美日韩| 中文字幕超碰在线| 欧美日韩精品| 色多多国产成人永久免费网站 | 一二三四区在线| 国产精品日本| 欧美国产日产韩国视频| 中文字幕乱码av| 日韩欧美影院| 精品国产一二三| av噜噜在线观看| 伊人久久视频| 亚洲成a人v欧美综合天堂| 樱花www成人免费视频| 日本a一级在线免费播放| 国产乱码精品一品二品| 国产精品嫩草影院久久久| 五月婷婷开心网| 国产精品www994| 日韩一区二区欧美| 国产又黄又粗的视频| 美女毛片一区二区三区四区| 亚洲第一福利在线观看| 久久人人爽人人片| 成人国产精品一区二区免费麻豆| 天天色综合成人网| 国产色一区二区三区| 制服丝袜在线播放| 亚洲日本电影在线| 中文字幕av久久| 日本精品在线| 国产精品成人免费| 一区二区精品视频| 女女色综合影院| 中文字幕一区在线| 亚洲视频sss| 麻豆视频在线观看免费网站| 国产精品久久久久久久岛一牛影视| 日本不卡一区二区三区视频| 男人天堂网在线观看| 91免费看片在线观看| 久久精品一二三区| 国产在线色视频| 国产欧美日本一区视频| 日韩视频专区| 免费大片在线观看www| 国产精品久久久久影院老司| 在线一区高清| www视频在线免费观看| 亚洲女人****多毛耸耸8| 福利在线小视频| 青春草免费在线视频| 亚洲成人手机在线| 欧美亚洲另类色图| 色综合天天色| 欧美精品成人一区二区三区四区| 国产又粗又长又爽又黄的视频| 国产精品1区| 欧美r级电影在线观看| 国产原创剧情av| 免费精品国产的网站免费观看| 亚洲精品一区二区在线| 国产农村妇女精品一区| 亚洲激情中文| 97在线观看免费| 黄色网址中文字幕| 国产一区二三区好的| 国产精品一区在线观看| 久久久资源网| 中文字幕一区免费在线观看| 97久久国产亚洲精品超碰热| 日本不卡1234视频| 欧美日韩国产另类一区| 乳色吐息在线观看| 一道本一区二区三区| 日韩中文字幕免费| 国产在线观看免费视频今夜| 三级不卡在线观看| 99精品国产高清一区二区| 手机看片国产1024| 国产精品视频看| 少妇人妻无码专区视频| 久久99久久久精品欧美| 日韩av中文字幕在线播放| 美国精品一区二区| 亚洲色诱最新| 99久久精品无码一区二区毛片| 福利视频在线导航| 亚洲成人手机在线| 亚洲一二三不卡| 精品国产一级毛片| 久久久亚洲影院| 91片黄在线观看喷潮| 91网页版在线| 国产1区2区3区中文字幕| 二吊插入一穴一区二区| 亚洲高清色综合| 黑人狂躁日本娇小| 日韩不卡免费视频| 免费观看国产成人| 蜜桃传媒在线观看免费进入 | 丰满少妇xbxb毛片日本| 波多野结衣一区| 97高清免费视频| a在线观看视频| 国产欧美日韩激情| 国产青青在线视频| 高清电影一区| 亚洲国产成人精品女人久久久 | 高清视频欧美一级| 亚洲天堂一二三| 91论坛在线播放| 玖玖精品在线视频| 四虎国产精品免费久久| 日韩精品久久久久| 亚洲av无码一区二区三区在线| 亚洲欧美清纯在线制服| 91久久精品国产91性色| eeuss影院在线观看| 一区二区三区视频在线看| 黄色a级三级三级三级| 国产一区二区三区四区二区| 午夜精品久久久久久久男人的天堂 | 欧美日本成人| 亚洲2020天天堂在线观看| 国产女18毛片多18精品| 亚洲视频图片小说| 亚洲综合欧美在线| 精品一区免费| 97色在线视频观看| www.亚洲欧美| 亚洲免费伊人电影| 波多野吉衣在线视频| 一本精品一区二区三区| 国产精品日韩久久久久| 黄色国产在线| 色94色欧美sute亚洲13| 成年女人免费视频| 一区二区三区精品视频在线观看| 成人自拍视频网站| 亚洲精品一线| 日韩精品最新网址| 欧美色图亚洲天堂| 国产一区在线观看麻豆| 中文字幕第一页亚洲| 欧美黄色网络| 日韩一区av在线| 国产欧美综合视频| 亚洲精品免费在线观看| 四虎国产精品永久免费观看视频| 性欧美69xoxoxoxo| 91亚洲精品久久久| 影音先锋男人资源在线| 日韩精品一区二区三区中文不卡 | 综合分类小说区另类春色亚洲小说欧美| 亚洲娇小娇小娇小| 天天超碰亚洲| 91蜜桃网站免费观看| 欧美午夜大胆人体| 欧美精品一区二区久久久| 福利所第一导航| 91网上在线视频| 亚洲成熟丰满熟妇高潮xxxxx| 久久99国产精品视频| 国产脚交av在线一区二区| yiren22亚洲综合伊人22| 色网站国产精品| 国产性xxxx| 成人少妇影院yyyy| 一本大道熟女人妻中文字幕在线 | 日本福利一区二区三区| 国产91在线播放精品| 久久精品免费电影| 亚洲精品成人区在线观看| 精品国产户外野外| 免费黄色片网站| 国产suv一区二区三区88区| 人人妻人人添人人爽欧美一区| 嫩草影视亚洲| 成人在线视频网| 欧美24videosex性欧美| 亚洲成人免费在线视频| 中文字幕人妻一区二区在线视频 | 一级少妇精品久久久久久久| 久久精品亚洲一区二区| 亚洲欧洲日韩综合二区| 狂野欧美xxxx韩国少妇| 国产精品99导航| 亚洲丝袜一区| 亚洲乱码av中文一区二区| 一级特黄aaa大片在线观看| 亚洲国产另类av| 久久国产精品国语对白| 久久婷婷成人综合色| 成人黄色一级大片| 亚洲在线免费| gogogo免费高清日本写真| 黄色欧美在线| 亚洲综合精品一区二区| 2022成人影院| 欧美日韩第一页| 草碰在线视频| 亚洲第一区中文99精品| 中文字幕在线播出| 午夜久久久久久| 一级黄色片日本| 国产日韩三级在线| 午夜男人的天堂| 免费高清视频精品| 五月婷婷深爱五月| 国产欧美日韩亚洲一区二区三区| 亚洲激情啪啪| 亚州精品视频| 国产在线日韩在线| 成人免费在线观看视频| 97在线视频观看| 日韩欧美一起| 久久精品久久久久久国产 免费| 噜噜噜噜噜在线视频| 亚洲美女黄色片| 黄频在线免费观看| 日韩欧美国产精品| 97在线视频人妻无码| 欧美午夜精品一区二区蜜桃| 日韩欧美国产亚洲| 亚洲制服丝袜av| 欧美黑人性猛交xxx| 1000部国产精品成人观看| 亚洲理论片在线观看| 91污片在线观看| 在线观看免费的av| 韩国av一区二区| 色婷婷综合网站| 免费高清在线一区| 亚洲少妇久久久| 捆绑变态av一区二区三区| 欧美丰满熟妇xxxxx| 日韩福利视频网| 激情婷婷综合网| 欧美亚洲免费| 成熟了的熟妇毛茸茸| 亚洲国内欧美| 欧美日本视频在线观看| 中文高清一区| 久久国产成人精品国产成人亚洲| 久久国产日本精品| 国产性生交xxxxx免费| 视频一区二区中文字幕| 日本激情视频在线| 青青青伊人色综合久久| 手机免费av片| 国产成人av电影在线| 国产乱淫av麻豆国产免费| 成人性生交大片免费看中文网站| 一级做a爱视频| 成人免费的视频| 女尊高h男高潮呻吟| 国产午夜亚洲精品不卡| 91香蕉国产视频| 1000精品久久久久久久久| 精品在线视频免费观看| 欧美日韩另类在线| 天堂网一区二区| 91精品欧美一区二区三区综合在| 国产1区在线观看| 国产视频一区在线| 高清日韩av电影| 久久久999国产| 日本在线观看大片免费视频| 日韩av免费在线| 欧美黄色成人| 都市激情久久久久久久久久久| 国产精品对白久久久久粗| 久久天堂国产精品| 午夜久久免费观看| 成年人午夜免费视频| 久久精品成人| 香蕉视频xxxx| 成人自拍视频在线观看| 人与嘼交av免费| 亚洲精品视频免费看| 国产精品免费精品一区| 欧美另类高清zo欧美| 欧美女优在线观看| 久久精品国产亚洲7777| 国产精品电影| 国产欧美精品一区二区| 给我免费播放日韩视频| 欧美日韩另类丝袜其他| 亚洲图片在线| 奇米影视四色在线| 91在线精品一区二区| 国产精品夜夜夜爽阿娇| 中文字幕在线不卡| 懂色av蜜臀av粉嫩av分享吧最新章节| 9191成人精品久久| 毛片网站在线观看| 久久久久久久一区二区三区| 少妇精品视频在线观看| 欧美1o一11sex性hdhd| 中文字幕一区二区三区欧美日韩| 国产精品50p| 成人黄色777网| 超碰97av在线| 精品久久久久久亚洲精品| 99国产精品99| 日韩成人在线播放| av中文在线资源| 亚洲一区二区三区xxx视频| 视频一区在线观看| 中文字幕在线乱| 精品一区二区综合| 精品国产成人亚洲午夜福利| 亚洲国产欧美日韩另类综合| 国产精品热久久| 麻豆国产精品va在线观看不卡| 性高爱久久久久久久久| 超碰97人人人人人蜜桃| 欧美好骚综合网| 在线观看岛国av| 国产视频911| 天堂а√在线中文在线新版| 亚洲成人中文字幕| 538在线视频| 99精彩视频在线观看免费| 亚洲国产精品日韩专区av有中文| 国产小视频精品| 国产精品久久久久天堂| 国语对白做受69按摩| 精品亚洲精品福利线在观看| 8x8ⅹ拨牐拨牐拨牐在线观看| 精品国产一区二区三区四区精华| 好吊日精品视频| 性生活在线视频| 亚洲色图丝袜美腿| 亚洲国产综合网| 久久99热精品| 91麻豆精品国产91久久久久推荐资源| 2021狠狠干| 国产精品18久久久久久久久| 久久高清免费视频| 亚洲精品电影在线观看| 绿色成人影院| 精品一区久久久久久| 日韩二区在线观看| 黄色激情小视频| 91精品国产综合久久福利软件| 国产精品一区在线看| 国产精品嫩草影院一区二区| 成人婷婷网色偷偷亚洲男人的天堂| 99热手机在线| 国产精品夫妻自拍| 无码人妻精品一区二区| 久久精品99久久久久久久久| 久久99久久久精品欧美| 亚洲欧美一二三| 成人免费毛片a| 在线观看日本网站| 一个人看的www久久| 在线国产成人影院| 国产人妻互换一区二区| 国产suv精品一区二区883| 日韩av在线电影| 在线观看亚洲区| 国产情侣一区在线| 成人网站免费观看入口| 91麻豆123| 国内精品久久久久久久久久 | 激情五月综合色婷婷一区二区 | 青草综合视频| 一二三四中文字幕| jvid福利写真一区二区三区| 国产男人搡女人免费视频| 日韩在线观看av| 1313精品午夜理伦电影| 欧美极品欧美精品欧美图片| 亚洲欧美韩国综合色| 少妇av在线播放| 国产精品视频免费在线观看| 欧美一区二区三区久久精品| 国产麻豆xxxvideo实拍| 欧美日韩午夜精品|