精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

成人在线免费看视频| 日本精品免费在线观看| 国产日韩欧美视频在线观看| 国产字幕视频一区二区| 亚洲国产精品小视频| 日韩毛片在线免费看| 青青影院在线观看| 大白屁股一区二区视频| 日本一区二区在线播放| 最新日韩免费视频| 久久动漫网址| 欧美挠脚心视频网站| 成年人深夜视频| 黄色影院在线播放| 成人在线视频一区二区| 国产精品香蕉av| 亚洲欧美综合自拍| 永久91嫩草亚洲精品人人| 亚洲嫩模很污视频| 亚洲少妇一区二区| 韩国精品视频在线观看| 午夜天堂影视香蕉久久| 伊人久久大香线蕉精品| 午夜视频www| 国产传媒日韩欧美成人| 国产精品久久久精品| 国产精品成人免费一区二区视频| 色无极亚洲影院| 亚洲欧美精品suv| 老司机av网站| 国产精品一区二区三区av| 欧美日韩一区二区三区 | 一区二区三区韩国| 91豆花视频在线播放| 最新中文字幕一区二区三区| 欧美一进一出视频| 五月婷婷在线观看视频| 国产精品1区2区| 成人福利视频网| 日韩欧美一级大片| 老**午夜毛片一区二区三区| 69国产精品成人在线播放| 久久久综合久久久| 亚洲精品小说| 成人97在线观看视频| а天堂中文在线资源| 成人婷婷网色偷偷亚洲男人的天堂| 亚洲精品白浆高清久久久久久| 日本成人在线免费| 日韩一级淫片| 精品国产制服丝袜高跟| 亚洲一区二区中文字幕在线观看| 在线视频成人| 91麻豆精品国产91久久久久| 国产成人美女视频| 亚洲青青一区| 欧美日韩激情在线| 欧美国产日韩在线视频| 66精品视频在线观看| 亚洲精品一线二线三线| 国产精品久久久久久在线观看| gogo人体一区| 亚洲电影天堂av | 波多野结衣欧美| 欧美成人国产一区二区| 无码人妻精品一区二区三区99不卡| 18国产精品| 日韩精品日韩在线观看| 精品人妻一区二区三区视频| 国产探花在线精品一区二区| 亚洲视频视频在线| 国产在线免费av| 亚洲成人一区| 高清亚洲成在人网站天堂| 欧美激情视频在线观看| 日本成人在线免费视频| 国产精品久久久久久吹潮| 欧美三级电影网| 奇米视频7777| 北条麻妃在线一区二区免费播放| 日韩激情视频在线| 免费看黄色的视频| 天天影视综合| 69**夜色精品国产69乱| 日本一区二区三区久久| 国产精品91xxx| 免费观看国产成人| 日本不卡在线| 亚洲成人自拍一区| 簧片在线免费看| 亚洲综合色婷婷在线观看| 日韩精品中文字幕在线播放| 5566中文字幕| 亚洲精品国产日韩| 国产精品夜间视频香蕉| 亚洲精品一区二区三区蜜桃| 2019国产精品| 国产911在线观看| 97成人资源| 日韩一区二区免费视频| 理论片大全免费理伦片| 国产精品99久久久久久动医院| 久久久久久一区二区三区 | 好操啊在线观看免费视频| 香蕉加勒比综合久久| 成 人 黄 色 小说网站 s色| 欧亚精品一区| 欧美日韩国产成人在线| 欧美特级黄色片| 成人免费视频免费观看| 亚洲一区影院| 大胆人体一区二区| 欧美tickling网站挠脚心| av免费播放网站| 国产亚洲精品久久久久婷婷瑜伽| 91色视频在线观看| 超碰国产在线| 91国在线观看| 久久人人妻人人人人妻性色av| 在线一区电影| 激情综合色丁香一区二区| 久久久久中文字幕| 影音先锋国产资源| 久久女同精品一区二区| 拔插拔插海外华人免费| 日韩精品一级| 久久九九全国免费精品观看| 欧美成人一区二区视频| 久久综合九色综合97婷婷女人| 91黄色在线看| 视频欧美一区| 蜜臀久久99精品久久久无需会员 | 成人软件在线观看| 亚洲电影免费观看高清| 欧美日韩大片在线观看| 国内一区二区在线| 亚洲最大色综合成人av| 浪潮色综合久久天堂| 亚洲男人第一av网站| 国产尤物在线视频| bt7086福利一区国产| 久操网在线观看| 成人av影音| 久久久久亚洲精品| 亚洲精品一区二区三区新线路| 亚洲女女做受ⅹxx高潮| 红桃视频一区二区三区免费| 99热国内精品| 91在线高清视频| 老司机精品影院| 555www色欧美视频| √天堂中文官网8在线| 韩国毛片一区二区三区| 手机看片日韩国产| 激情综合婷婷| 久久91超碰青草是什么| 亚洲欧美强伦一区二区| 亚洲va中文字幕| 性色av蜜臀av色欲av| 亚洲一区二区动漫| 日本一区二区三区免费观看| 无人区在线高清完整免费版 一区二| 一区二区三区回区在观看免费视频| 一级久久久久久| 国产精品麻豆视频| 亚洲丝袜在线观看| 蜜乳av中文字幕| 国产精品亚洲产品| 日韩av电影免费在线观看| 激情亚洲影院在线观看| 色噜噜亚洲精品中文字幕| 国产伦精品一区二区三区四区| 最新国产の精品合集bt伙计| 4438x全国最大成人| 亚洲第一毛片| 日本一区二区三区在线视频| www.久久99| 久久久女人电视剧免费播放下载| 天堂av中文在线资源库| 在线观看日韩精品| 欧美精品一区二区成人| 久久综合九色欧美综合狠狠| 亚洲欧美自偷自拍另类| 欧美日韩国产色综合一二三四| 精品一区二区三区免费毛片| 欧洲av一区二区| 另类美女黄大片| 视频一区二区在线播放| 欧美丰满嫩嫩电影| 久久草视频在线| 国产精品美女www爽爽爽| 国产91在线免费观看| 国产美女诱惑一区二区| 最新黄色av网站| 欧美顶级毛片在线播放| 国产狼人综合免费视频| 国产社区精品视频| 日韩中文字幕在线播放| 免费的黄色av| 精品视频999| 在线观看黄网站| 亚洲日本成人在线观看| 最近中文字幕无免费| 国产一区日韩二区欧美三区| 男人的天堂99| 午夜久久一区| 亚洲欧洲日韩综合二区| 日韩极品在线| www久久99| 欧美aaaaaaaa| 热99在线视频| 成人爽a毛片免费啪啪动漫 | 国产视频在线播放| 亚洲欧美日韩久久久久久| 99热这里只有精品99| 欧美性videos高清精品| 麻豆一区产品精品蜜桃的特点| 久久久久久9999| 91九色蝌蚪porny| 神马午夜一区二区| 国产精品乱子久久久久| 精品一区二区视频在线观看| 激情图片小说一区| 亚洲一区在线不卡| 久久午夜av| 麻豆tv在线播放| 在线视频观看日韩| 97超碰在线视| 欧美成人首页| 超碰97在线看| 欧美在线国产| 2021狠狠干| 久久精品青草| 91免费视频黄| 欧美成人国产| 97久久国产亚洲精品超碰热| 亚州av乱码久久精品蜜桃| 亚洲精品国产一区| 成人在线免费观看视频| 欧洲精品亚洲精品| 国产日产一区| 日韩欧美亚洲区| 成人网18免费网站| 亚洲高清123| 欧美va久久久噜噜噜久久| 无码免费一区二区三区免费播放| 精品日韩在线| 一区二区视频在线观看| 91精品国产乱码久久久久久 | 亚洲一区二区日本| 99国内精品久久久久| 国产中文字幕亚洲| 国产欧美88| 亚洲自拍偷拍在线| 亚洲一区二区三区日本久久九| 成人看片在线| 日本天堂一区| 日韩高清国产一区在线观看| 精品黄色一级片| 在线不卡视频一区二区| 黄色一级视频免费看| 久久免费国产精品| 国产传媒在线看| 中文字幕一区二区日韩精品绯色| 51精品免费网站| 亚洲专区一二三| 国产精品久久久免费视频| 亚洲成人你懂的| 国产精品suv一区| 欧美日韩激情在线| 精品人妻av一区二区三区| 亚洲精品一线二线三线| 黄色av免费在线看| 久久精品人人做人人爽| 麻豆av在线免费观看| 欧美一级片一区| 久久精品xxxxx| 国产成人av一区二区三区| 亚洲素人在线| 99亚洲精品视频| 亚洲精品在线二区| 在线观看免费黄网站| 国产九色精品成人porny| 一区二区免费在线观看视频| 中文字幕不卡在线| 久久久香蕉视频| 欧美在线视频全部完| 国产三区在线播放| 亚洲乱码国产乱码精品精| 男人的天堂在线视频免费观看| 欧美精品videosex性欧美| 日本免费久久| 97人人模人人爽人人少妇| 免费视频一区三区| av动漫在线播放| 免费美女久久99| 国产精品九九视频| 国产欧美日韩激情| 精品无码久久久久久久久| 欧美在线观看视频在线| 亚洲国产剧情在线观看| 中文字幕亚洲综合久久筱田步美| 美女航空一级毛片在线播放| 国产精品偷伦一区二区 | 欧美国产二区| 午夜电影亚洲| 激情视频免费网站| 97久久精品人人做人人爽| 国产免费一区二区三区四区| 日韩欧美在线一区| 欧美一级在线免费观看| 久久视频免费在线播放| 欧美精品高清| 久久99精品久久久久久水蜜桃| 亚洲国产精品久久久久蝴蝶传媒| 香港三级韩国三级日本三级| 国产精品一二三| 青青操在线播放| 欧美三级日韩在线| 美国一级片在线免费观看视频| 久久久久久久久久亚洲| 精品视频在线播放一区二区三区| 水蜜桃一区二区| 久久青草久久| 免费看黄色aaaaaa 片| 亚洲成av人片一区二区| 精品国产乱码久久久久久蜜臀网站| 中文字幕综合一区| 色香欲www7777综合网| 欧美日韩亚洲在线| 午夜亚洲影视| 国产麻豆xxxvideo实拍| 亚洲国产成人91porn| av中文字幕免费| 久久成人人人人精品欧| 亚洲精品毛片| 正在播放91九色| 久久成人免费网站| 日本在线观看网址| 欧美在线制服丝袜| 最新97超碰在线| 国产女同一区二区| 欧美aaaaaaaaaaaa| 日韩av影视大全| 亚洲日本在线a| 国产成人精品一区二三区四区五区| 久久亚洲精品成人| 麻豆精品在线| 国产精品va在线观看无码| 国产成人综合亚洲网站| 久久无码精品丰满人妻| 精品福利一二区| 天堂av在线网| 欧美深深色噜噜狠狠yyy| 日韩中文字幕91| 日本二区三区视频| 欧美一区二区久久久| 羞羞视频在线观看免费| 国产chinese精品一区二区| 亚洲黄色影院| 受虐m奴xxx在线观看| 欧美在线色视频| 国产黄色在线免费观看| 999视频在线观看| 日韩视频一区| 99久久精品免费视频| 7777精品伊人久久久大香线蕉经典版下载 | 精品国产18久久久久久二百| 日韩专区第三页| 99国产精品国产精品毛片| 51国产偷自视频区视频| 中文字幕av日韩| av在线成人| 黄色一级视频片| 国产精品久久久久久久久久免费看| 国产免费一区二区三区免费视频| 欧美精品video| 视频一区欧美| 午夜影院免费版| 欧美日韩激情视频| 调教视频免费在线观看| 粉嫩精品一区二区三区在线观看| 免费日韩av片| 国产传媒免费在线观看| 亚洲精品久久久久中文字幕二区| 电影亚洲精品噜噜在线观看| 日韩最新中文字幕| av在线播放成人| 一级黄色片视频| 91国在线精品国内播放| 成人羞羞视频播放网站| 一区二区三区人妻| 日本乱码高清不卡字幕| 成人ww免费完整版在线观看| 欧美久久久久久一卡四| 国产麻豆成人传媒免费观看| 波多野结衣理论片| 久久久久久噜噜噜久久久精品| 日韩欧美电影| 亚洲天堂网一区二区|