最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入理解React?State?原理

 更新時間:2022年01月13日 08:35:48   作者:YuLong~W  
本文主要介紹了React?State?原理,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

問題:setState 到底是同步還是異步的?

如果對 React 底層有一定了解,可以回答出 batchUpdate 批量更新概念,以及批量更新被打破的條件。

答案:有時是同步,有時是異步。

在 合成事件 和 生命周期函數(shù) 里是 異步 的在 原生事件 和 setTimeout、promise里是 同步

造成setState的異步并不是由內(nèi)部的異步代碼引起的,在本身的執(zhí)行過程中時同步的,但是合成事件和生命周期函數(shù)的調(diào)用順序在更新之前,導(dǎo)致在內(nèi)部不能直接得到更新后的值,可以用第二個參數(shù) callback 來獲取。

具體解釋:可參考setState的執(zhí)行過程

類組件state

setState(obj,callback)

  • 第一個參數(shù):當(dāng) obj 為一個對象,則為即將合并的 state ;如果 obj 是一個函數(shù),那么當(dāng)前組件的 state 和 props 將作為參數(shù),返回值用于合并新的 state。
  • 第二個參數(shù) callback :callback 為一個函數(shù),函數(shù)執(zhí)行上下文中可以獲取當(dāng)前 setState 更新后的最新 state 的值,可以作為依賴 state 變化的副作用函數(shù),可以用來做一些基于 DOM 的操作。

一次事件中觸發(fā)一次如上 setState ,在 React 底層執(zhí)行過程:

render 階段 render 函數(shù)執(zhí)行 -> commit 階段真實 DOM 替換 -> setState 回調(diào)函數(shù)執(zhí)行 callback

在這里插入圖片描述

首先,setState 會產(chǎn)生當(dāng)前更新的優(yōu)先級(老版本用 expirationTime ,新版本用 lane )。接下來 React 會從 fiber Root 根部 fiber 向下調(diào)和子節(jié)點,調(diào)和階段將對比發(fā)生更新的地方,更新對比 expirationTime ,找到發(fā)生更新的組件,合并 state,然后觸發(fā) render 函數(shù),得到新的 UI 視圖層,完成 render 階段。接下來到 commit 階段,commit 階段,替換真實 DOM ,完成此次更新流程。此時仍然在 commit 階段,會執(zhí)行 setState 中 callback 函數(shù),到此為止完成了一次 setState 全過程。

setState原理揭秘

本質(zhì):React 底層調(diào)用 Updater 對象上的 enqueueSetState 方法

enqueueSetState():創(chuàng)建一個update,放入當(dāng)前 fiber對象 的待更新隊列中,最后開啟調(diào)度更新,進入更新流程。

在這里插入圖片描述

React 的 batchUpdate 批量更新

目的:多次 setstate 會讓邏輯多停留在 js 運行層面,阻塞了瀏覽器繪制,因此需要批量更新

batchedEventUpdates ():

在這里插入圖片描述

分析流程:

  • React 事件執(zhí)行前通過 isBatchingEventUpdates=true 打開開關(guān),開啟事件批量更新
  • 當(dāng)事件結(jié)束,通過 isBatchingEventUpdates=false 關(guān)閉開關(guān)
  • 在 scheduleUpdateOnFiber 中根據(jù)這個開關(guān)來確定是否進行批量更新

1)異步環(huán)境下,繼續(xù)開啟批量更新模式:

異步操作里面的批量更新規(guī)則會被打破,因此提供了手動批量更新方法: unstable_batchedUpdates

2)提升更新優(yōu)先級:

提供了方法: flushSync,可以將回調(diào)函數(shù)中的更新任務(wù),放在一個較高的優(yōu)先級中優(yōu)先執(zhí)行

補充:flushSync 在同步條件下,會合并之前的 setState | useState

3)總結(jié):React 同一級別更新優(yōu)先級 關(guān)系是:

flushSync 中的 setState > 正常執(zhí)行上下文中 setState > 異步 setTimeout ,Promise 中的 setState

函數(shù)組件state

const [ state , dispatch ] = useState(initData)

  • ① state 目的提供給 UI ,作為渲染視圖的數(shù)據(jù)源
  • ② dispatch 改變 state 的函數(shù),可以理解為推動函數(shù)組件渲染的渲染函數(shù)
  • ③ initData 初始值

initData的初始值

  • 第一種情況是非函數(shù),將作為 state 初始化的值
  • 第二種情況是函數(shù),函數(shù)的返回值作為 useState 初始化的值

dispatch的參數(shù)

  • 第一種非函數(shù)情況,此時將作為新的值,賦予給 state,作為下一次渲染使用
  • 第二種是函數(shù)的情況,如果 dispatch 的參數(shù)為一個函數(shù),這里可以稱它為reducer,reducer 參數(shù),是上一次返回最新的 state,返回值作為新的 state

監(jiān)聽 state 變化

useEffect :常可以把 state 作為 依賴項 傳入 useEffect 第二個參數(shù) deps ,但是注意 useEffect 初始化會默認(rèn)執(zhí)行一次

dispatch更新特點

與類組件一樣,但是當(dāng)調(diào)用改變 state 的函數(shù)dispatch,在本次函數(shù)執(zhí)行上下文中,是獲取不到最新的 state 值的

在這里插入圖片描述


原因:函數(shù)組件更新就是函數(shù)的執(zhí)行,在一次執(zhí)行過程中,函數(shù)內(nèi)部所有變量重新聲明,所以改變的 state 只有在下一次函數(shù)執(zhí)行時才更新。

useState 原理在之后 Hooks 講解

問:類組件中的 setState 和函數(shù)組件中的 useState 有什么異同?

答:相同點:

  • 原理:setState 和 useState 更新視圖,底層都調(diào)用了 scheduleUpdateOnFiber 方法,而且事件驅(qū)動情況下都有批量更新規(guī)則
  • 語法:第一個參數(shù)都可以傳入函數(shù)

不同點:

  • 在不是 pureComponent 組件模式下, setState 不會淺比較兩次 state 的值。只要調(diào)用 setState 就會執(zhí)行更新。但是 useState 中 dispatchAction 會默認(rèn)比較兩次state是否相同來更新組件
  • setState 有專門監(jiān)聽 state 變化的回調(diào)函數(shù) callback,可以獲取最新 state。但是 useState 只能通過 useEffect 來執(zhí)行 state 變化引起的副作用
  • setState 在底層處理邏輯時將舊 state 進行合并處理,而 useState 是重新賦值

到此這篇關(guān)于深入理解React State 原理的文章就介紹到這了,更多相關(guān)React State 原理 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • react組件中的constructor和super知識點整理

    react組件中的constructor和super知識點整理

    這篇文章主要介紹了react組件中的constructor和super知識點整理,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08
  • React路由參數(shù)傳遞與嵌套路由的實現(xiàn)詳細講解

    React路由參數(shù)傳遞與嵌套路由的實現(xiàn)詳細講解

    這篇文章主要介紹了React路由參數(shù)傳遞與嵌套路由的實現(xiàn),嵌套路由原則是可以無限嵌套,但是必須要讓使用二級路由的一級路由匹配到,否則不顯示,需要的朋友可以參考一下
    2022-09-09
  • React實現(xiàn)路由返回攔截的三種方式

    React實現(xiàn)路由返回攔截的三種方式

    最近項目為了避免用戶誤操作導(dǎo)致數(shù)據(jù)丟失,增加返回攔截功能,但是之前由于qiankun的報錯導(dǎo)致這個功能一直有一些問題,所以專門獨立搞了一個專題研究在react中各種方式實現(xiàn)這個功能,需要的朋友可以參考下
    2024-05-05
  • Redux中間件的使用方法教程

    Redux中間件的使用方法教程

    中間件就是一個函數(shù),對store.dispatch方法進行了改造,在發(fā)出 Action 和執(zhí)行 Reducer 這兩步之間,添加了其他功能,要理解中間件,關(guān)鍵點是要知道,這個中間件是連接哪些部分的軟件,它在中間做了什么事,提供了什么服務(wù)
    2023-01-01
  • React Navigation 使用中遇到的問題小結(jié)

    React Navigation 使用中遇到的問題小結(jié)

    本篇文章主要介紹了React Navigation 使用中遇到的問題小結(jié),主要是安卓和iOS中相對不協(xié)調(diào)的地方,特此記錄,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • React HOC高階組件深入講解

    React HOC高階組件深入講解

    高階組件就是接受一個組件作為參數(shù)并返回一個新組件(功能增強的組件)的函數(shù)。這里需要注意高階組件是一個函數(shù),并不是組件,這一點一定要注意,本文給大家分享React 高階組件HOC使用小結(jié),一起看看吧
    2022-10-10
  • react中使用usestate踩坑及解決

    react中使用usestate踩坑及解決

    這篇文章主要介紹了react中使用usestate踩坑及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 淺談從React渲染流程分析Diff算法

    淺談從React渲染流程分析Diff算法

    這篇文章主要介紹了淺談從React渲染流程分析Diff算法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • react-router4 配合webpack require.ensure 實現(xiàn)異步加載的示例

    react-router4 配合webpack require.ensure 實現(xiàn)異步加載的示例

    本篇文章主要介紹了react-router4 配合webpack require.ensure 實現(xiàn)異步加載的示例,非常具有實用價值,需要的朋友可以參考下
    2018-01-01
  • react-native 完整實現(xiàn)登錄功能的示例代碼

    react-native 完整實現(xiàn)登錄功能的示例代碼

    本篇文章主要介紹了react-native 完整實現(xiàn)登錄功能的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09

最新評論

和平区| 金秀| 阳江市| 阳东县| 曲水县| 浦北县| 桃源县| 永寿县| 遵义市| 弋阳县| 双辽市| 思茅市| 安顺市| 虹口区| 元阳县| 阳朔县| 长子县| 博白县| 清苑县| 双鸭山市| 沙河市| 沾化县| 哈尔滨市| 札达县| 乌兰察布市| 剑川县| 峨边| 吉首市| 循化| 金湖县| 榆林市| 灵台县| 威宁| 宽甸| 大石桥市| 崇义县| 嘉鱼县| 岑溪市| 海阳市| 怀集县| 商南县|