日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

精準(zhǔn)解析 useLayoutEffect 與 useEffect 的執(zhí)行時機(jī)

來源: 責(zé)編: 時間:2024-01-17 10:13:53 237觀看
導(dǎo)讀我們前面花了大量篇幅,從基礎(chǔ)、理論、實踐、總結(jié)幾個方面,全方位的為大家分析了 useEffect。除此之外,React 還提供了一個與 useEffect 幾乎一樣的 hook,它就是useLayoutEffect。我們約定,useEffect 傳入的第一個參數(shù)為 ef

MhT28資訊網(wǎng)——每日最新資訊28at.com

我們前面花了大量篇幅,從基礎(chǔ)、理論、實踐、總結(jié)幾個方面,全方位的為大家分析了 useEffect。除此之外,React 還提供了一個與 useEffect 幾乎一樣的 hook,它就是useLayoutEffect。MhT28資訊網(wǎng)——每日最新資訊28at.com

我們約定,useEffect 傳入的第一個參數(shù)為 effect,useLayoutEffect 傳入的第一個參數(shù)為 layoutEffect。MhT28資訊網(wǎng)——每日最新資訊28at.com

他們的語法為:MhT28資訊網(wǎng)——每日最新資訊28at.com

// 中括號表示參數(shù)可選useEffect(effect[, deps])
useLayoutEffect(layoutEffect[, deps])

兩個 hook 有高度相似的語義。MhT28資訊網(wǎng)——每日最新資訊28at.com

第一個參數(shù) layoutEffect 為一個函數(shù),定義為副作用執(zhí)行邏輯,我們也可以在 layoutEffect 中定義返回函數(shù)。當(dāng)依賴項發(fā)生了變化時,返回函數(shù)會使用依賴項舊值首先執(zhí)行,然后再執(zhí)行 layoutEffect。MhT28資訊網(wǎng)——每日最新資訊28at.com

useLayoutEffect(() => {  // ...    return () => {}}, [state])

第二個參數(shù)為依賴項數(shù)組。React 內(nèi)部會使用 Object.is 去比較依賴項是否發(fā)生了變化,我們通常會選擇使用 state 或者 props 等響應(yīng)性數(shù)據(jù)作為依賴項。依賴項也可以不傳,此時 layoutEffect 在每次狀態(tài)發(fā)生變化時都會執(zhí)行。MhT28資訊網(wǎng)——每日最新資訊28at.com

useLayoutEffect 與 useEffect 唯一的區(qū)別在于 effect 與 layoutEffect 執(zhí)行時機(jī)的不同。MhT28資訊網(wǎng)——每日最新資訊28at.com

我們借助一個例子來仔細(xì)分析他們的準(zhǔn)確執(zhí)行時機(jī)。MhT28資訊網(wǎng)——每日最新資訊28at.com

首先是 useEffect。MhT28資訊網(wǎng)——每日最新資訊28at.com

const [count, setCount] = useState(0)useEffect(() => {  document.title = `React ${count}`})

effect 會在組件渲染完成之后執(zhí)行。這里組件渲染完成的意思是當(dāng)組件內(nèi)容已經(jīng)呈現(xiàn)在頁面上之后,effect 再執(zhí)行,具體的步驟如下圖所示:MhT28資訊網(wǎng)——每日最新資訊28at.com

MhT28資訊網(wǎng)——每日最新資訊28at.com

在事件循環(huán)中, effect 是被定義為宏任務(wù),在下一輪循環(huán)執(zhí)行。MhT28資訊網(wǎng)——每日最新資訊28at.com

然后是 useLayoutEffect。MhT28資訊網(wǎng)——每日最新資訊28at.com

const [count, setCount] = useState(0)useLayoutEffect(() => {  document.title = `React ${count}`})

layoutEffect 會在組件渲染之前執(zhí)行。具體的步驟如下圖。MhT28資訊網(wǎng)——每日最新資訊28at.com

MhT28資訊網(wǎng)——每日最新資訊28at.com

但是這里如果只是這樣理解的話,估計很多人并不太清晰具體是怎么回事。因為這樣的表達(dá)并沒有說清楚具體的執(zhí)行時刻。更準(zhǔn)確的說法是在 commit 之后,組件內(nèi)容繪制呈現(xiàn)到屏幕之前。MhT28資訊網(wǎng)——每日最新資訊28at.com

例如我們有這樣一段代碼。MhT28資訊網(wǎng)——每日最新資訊28at.com

// 此時已經(jīng)對DOM發(fā)送改變的指令div.style.color = 'red'layoutEffect()

layoutEffect 緊隨 DOM 修改指令發(fā)出之后執(zhí)行,此時雖然 DOM 指令已經(jīng)發(fā)出,但是在瀏覽器的機(jī)制中,內(nèi)容繪制是一個異步的過程,這會兒繪制并沒有執(zhí)行。MhT28資訊網(wǎng)——每日最新資訊28at.com

因此在事件循環(huán)中,layoutEfect 被定義為類似于 Promise 的微任務(wù),在 DOM 指令修改之后,內(nèi)容繪制之前執(zhí)行。MhT28資訊網(wǎng)——每日最新資訊28at.com

后續(xù)影響

大家可以猜想一下,如果我們在 layoutEffect 中直接去修改 state,會發(fā)生什么事情。MhT28資訊網(wǎng)——每日最新資訊28at.com

看看下面這個例子:MhT28資訊網(wǎng)——每日最新資訊28at.com

function Demo() {  const [count, setCount] = useState(0)    useLayoutEffect(() => {    if (count == 0) {      setCount(1)    }  }, [count])      return (    <div>      <div>{count}</div>      <button         onClick={() => setCount(0)}      >        reset 0      </button>    </div>  )}

我們在 state 中聲明一個變量 count,初始值設(shè)置為 0,并定義 layoutEffect,其中的邏輯就是當(dāng) count == 0 時,將 count 設(shè)置為 1。MhT28資訊網(wǎng)——每日最新資訊28at.com

添加一個按鈕,當(dāng)按鈕點擊時,把 count 重新設(shè)置為 0。MhT28資訊網(wǎng)——每日最新資訊28at.com

大家思考一下,此時,頁面上的顯示結(jié)果,會在 0 和 1 之間來回切換嗎?MhT28資訊網(wǎng)——每日最新資訊28at.com

答案是不會。MhT28資訊網(wǎng)——每日最新資訊28at.com

因為當(dāng)我們執(zhí)行 layoutEffect 時,UI 并沒有進(jìn)入事件循環(huán)的繪制流程,此時還處于 JS 邏輯的執(zhí)行過程中,那么這個時候執(zhí)行 setCount,整個邏輯會重新執(zhí)行,對于瀏覽器而言,JS 針對同一個 UI 發(fā)出了兩條不同的指令,在瀏覽器的渲染機(jī)制中,也會發(fā)生收集行為,將這兩條指令進(jìn)行合并,最后只執(zhí)行一條。MhT28資訊網(wǎng)——每日最新資訊28at.com

// setCount(0)div.innerHTML = 0// setCount(1)div.innerHTML = 1

如上例,當(dāng) setCount(0) 與 setCount(1)  執(zhí)行完之后,實際上是發(fā)出了兩條修改元素內(nèi)容的指令給到瀏覽器。MhT28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)我們使用 useLayoutEffect 時他可能會覆蓋你想要執(zhí)行的渲染內(nèi)容,也有可能會阻塞你的正常渲染過程,因此我們在使用它時,需要精確把控他的執(zhí)行時機(jī),防止出現(xiàn)你不想看到的結(jié)果。MhT28資訊網(wǎng)——每日最新資訊28at.com

但是很明顯我們可以看到 layoutEffect 的執(zhí)行時機(jī)比 effect 更早。因此我們也可以在 layoutEffect 中,執(zhí)行一些輕量的,不直接影響 state 的邏輯。MhT28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-63227-0.html精準(zhǔn)解析 useLayoutEffect 與 useEffect 的執(zhí)行時機(jī)

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Java高頻面試題:過濾器和攔截器兩位難兄難弟區(qū)別

下一篇: 這篇文章徹底讓你了解Java與RPA

標(biāo)簽:
  • 熱門焦點
  • Find N3入網(wǎng):最高支持16+1TB

    OPPO將于近期登場的Find N3折疊屏目前已經(jīng)正式入網(wǎng),型號為PHN110。本次Find N3在外觀方面相比前兩代有很大的變化,不再是小號的橫向折疊屏,而是跟別的廠商一樣采用了較為常見的
  • 線程通訊的三種方法!通俗易懂

    線程通信是指多個線程之間通過某種機(jī)制進(jìn)行協(xié)調(diào)和交互,例如,線程等待和通知機(jī)制就是線程通訊的主要手段之一。 在 Java 中,線程等待和通知的實現(xiàn)手段有以下幾種方式:Object 類下
  • 一文看懂為蘋果Vision Pro開發(fā)應(yīng)用程序

    譯者 | 布加迪審校 | 重樓蘋果的Vision Pro是一款混合現(xiàn)實(MR)頭戴設(shè)備。Vision Pro結(jié)合了虛擬現(xiàn)實(VR)和增強(qiáng)現(xiàn)實(AR)的沉浸感。其高分辨率顯示屏、先進(jìn)的傳感器和強(qiáng)大的處理能力
  • 學(xué)習(xí)JavaScript的10個理由...

    作者 | Simplilearn編譯 | 王瑞平當(dāng)你決心學(xué)習(xí)一門語言的時候,很難選擇到底應(yīng)該學(xué)習(xí)哪一門,常用的語言有Python、Java、JavaScript、C/CPP、PHP、Swift、C#、Ruby、Objective-
  • 大廠卷向扁平化

    來源:新熵作者丨南枝 編輯丨月見大廠職級不香了。俗話說,兵無常勢,水無常形,互聯(lián)網(wǎng)企業(yè)調(diào)整職級體系并不稀奇。7月13日,淘寶天貓集團(tuán)啟動了近年來最大的人力制度改革,目前已形成一
  • 華為發(fā)布HarmonyOS 4:更好玩、更流暢、更安全

    在8月4日的華為開發(fā)者大會2023(HDC.Together)大會上,HarmonyOS 4正式發(fā)布。自2019年發(fā)布以來,HarmonyOS一直以用戶為中心,經(jīng)歷四年多的發(fā)展HarmonyOS已
  • iQOO Neo8 Pro即將開售:到手價3099元起 安卓性能最強(qiáng)旗艦

    5月23日,iQOO如期舉行了新品發(fā)布會,全新的iQOO Neo8系列也正式與大家見面,包含iQOO Neo8和iQOO Neo8 Pro兩個版本,其中標(biāo)準(zhǔn)版搭載高通驍龍8+,而Pro版更
  • onebot M24巧系列一體機(jī)采用輕薄機(jī)身設(shè)計,現(xiàn)已在各平臺開售

    onebot M24 巧系列一體機(jī)目前已在線上線下各平臺同步開售。onebot M24 巧系列采用一體化輕薄機(jī)身設(shè)計,最薄處為 10.15mm,擁有寶石紅、午夜藍(lán)、石墨綠、雅致
  • SN570 NVMe SSD固態(tài)硬盤 價格與性能兼具

    SN570 NVMe SSD固態(tài)硬盤是西部數(shù)據(jù)發(fā)布的最新一代WD Blue系列的固態(tài)硬盤,不僅閃存技術(shù)更為精進(jìn),性能也得到了進(jìn)一步的躍升。WD Blue SN570 NVMe SSD的包裝外
Top 主站蜘蛛池模板: 延安市| 四子王旗| 嘉祥县| 河南省| 开封县| 穆棱市| 三穗县| 泰兴市| 武宣县| 肃宁县| 瑞金市| 通山县| 荃湾区| 杭锦后旗| 安陆市| 海南省| 鹤峰县| 新丰县| 赤壁市| 永丰县| 上栗县| 连云港市| 寿阳县| 天津市| 贵溪市| 江城| 沙湾县| 汉源县| 凤凰县| 娄烦县| 师宗县| 铜山县| 沙田区| 乳山市| 张家口市| 岳池县| 洛宁县| 富民县| 嵊州市| 巴中市| 留坝县|