React18原理: React核心對象之Update、UpdateQueue、Hook、Task對象

Update 與 UpdateQueue 對象


1 ) 概述

  • 在fiber對象中有一個屬性 fiber.updateQueue
  • 是一個鏈式隊列(即使用鏈表實現的隊列存儲結構)
  • 是和頁面更新有關的

2 )Update對象相關的數據結構

// https://github.com/facebook/react/blob/v18.2.0/packages/react-reconciler/src/ReactFiberClassUpdateQueue.new.js#L123
export type Update<State> = {// eventTime: number, // 這個屬性后續被刪除了 可以忽略了lane: Lane,tag: 0 | 1 | 2 | 3,payload: any,callback: (() => mixed) | null,next: Update<State> | null,
};export type SharedQueue<State> = {pending: Update<State> | null,lanes: Lanes,hiddenCallbacks: Array<() => mixed> | null,
};export type UpdateQueue<State> = {baseState: State,firstBaseUpdate: Update<State> | null,lastBaseUpdate: Update<State> | null,shared: SharedQueue<State>,callbacks: Array<() => mixed> | null,
};
  • Update 屬性
    • lane: update所屬優先級
    • tag: 表示 update種,4種. UpdateState, ReplaceState, ForceUpdate, CaptureUpdate
    • payload: 載荷,update對象真正需要更新的數據,可以設置成一個回調函數或者對象.
    • callback: 回調函數.commit完成之后會調用.
    • next: 指向鏈表中的下一個,由于UpdateQueue是一個環形鏈表,最后一個update.next指向第一個update對象
  • UpdateQueue 屬性
    • baseState: 表示此隊列的基礎state
    • firstBaseUpdate: 指向基礎隊列的隊首
    • lastBaseUpdate: 指向基礎隊列的隊尾
    • shared: 共享隊列
    • callbacks: 用于保存有callback回調函數的update對象,在commit之后,會依次調用這里的回調函數.
  • SharedQueue 屬性
    • pending:指向即將輸入的update隊列.在class組件中調用setState()之后,會將新的update對象添加到這個隊列中來

updateQueue是fiber對象的一個屬性,它們之間數據結構和引用關系如下

Hooks 對象


1 ) 概述

  • Hook用于 function 組件中,能夠保持function組件的狀態
  • 與class組件中的 state在性質上是相同的,都是為了保持組件的狀態
  • 在rect@16.8以后,官方開始推薦使用Hook語法,常用的api有usestate, useEffect,usecallback等
  • 到目前為止,官方一共定義了17種Hook類型

2 )結構類型

// https://github.com/facebook/react/blob/v18.2.0/packages/react-reconciler/src/ReactFiberHooks.new.js#L148
export type Hook = {|memoizedState: any,baseState: any,baseQueue: Update<any, any> | null,queue: any,next: Hook | null,
|};// /packages/react-reconciler/src/ReactFiberHooks.new.js#L126
export type Update<S, A> = {|lane: Lane,action: A,hasEagerState: boolean,eagerState: S | null,next: Update<S, A>,
|};// /packages/react-reconciler/src/ReactFiberHooks.new.js#L134
export type UpdateQueue<S, A> = {|pending: Update<S, A> | null,lanes: Lanes,dispatch: (A => mixed) | null,lastRenderedReducer: ((S, A) => S) | null,lastRenderedState: S | null,
|};
  • Hook 屬性

    • memoizedState: 內存狀態,用于輸出成最終的fiber樹
    • basestate: 基礎狀態,當Hook.queue更過后,basestate也會更新.
    • baseQueue: 基礎狀態隊列,在reconciler階段會輔助狀態合并.
    • queue: 指向一個Update隊列
    • next: 指向該function組件的下一個Hook對象,使得多個Hook之間也構成了一個鏈表.
  • 注意

    • Hook.queue 和 Hook.baseQueue(即 UpdateQueue 和 Update)是為了保證 Hook 對象能夠順利更新
    • 與 fiber.updateQueue 中的 UpdateQueue 和 Update 是不一樣的(且它們在不同的文件)
  • Hook與fiber的關系

    • 在fiber對象中有一個屬性 fiber.memoizedState 指向fiber節點的內存狀態.
    • 在function類型的組件中,fiber.memoizedState 就指向Hook隊列(Hook隊列保存了 function類型的組件狀態).
    • 所以Hook也不能脫離fiber而存在,它們之間的引用關系如下:

Task 對象

  • scheduler包中,沒有為task對象定義type,其定義是直接在js代碼中:

    // https://github.com/facebook/react/blob/v18.2.0/packages/scheduler/src/forks/Scheduler.js#L345
    var newTask = {id: taskIdCounter++,callback,priorityLevel,startTime,expirationTime,sortIndex: -1,
    };
    
  • 屬性解釋:

    • id: 位移標識
    • callback: task最核心的字段,指向react-reconciler包所提供的回調函數.
    • prioritylevel: 優先級
    • startTime: 一個時間戳,代表task的開始時間(創建時間+延時時間).
    • expirationTime: 過期時間.
    • sortIndex: 控制task在隊列中的次序,值越小的越靠前
  • 注意task中沒有next屬性,它不是一個鏈表,其順序是通過堆排序來實現的

  • 小頂堆數組,始終保證數組中的第一個task對象優先級最高

  • 堆參考
    • 最小堆:https://blog.csdn.net/Tyro_java/article/details/133468244
    • 最大堆:https://blog.csdn.net/Tyro_java/article/details/133530983

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/696900.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/696900.shtml
英文地址,請注明出處:http://en.pswp.cn/news/696900.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Nginx】Nginx配置反向代理 和 https

nginx.conf配置 進入linux /etc/nginx/ 打開nginx.conf 進行以下配置 http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;server {#監聽443端口listen 443 ssl;#你的域名server_name huiblog.top;#ssl證書的pe…

VSCode The preLaunchTask ‘C/C++: clang++ 生成活動文件‘ terminated with exit code -1

更改tasks.json文件里面的type為shell 選擇g 選擇g&#xff0c;然后點回到text.c&#xff0c;按下F5. 得到結果。 文中內容參考: 從零開始手把手教你配置屬于你的VS Code_嗶哩嗶哩_bilibili https://blog.csdn.net/qq_63872647/article/details/128006861

【EasyV】QGIS轉換至EasyV

QGIS轉換至EasyV 第一步&#xff1a;導入QGIS第二步 坐標系轉換第三步 集合修正第四步 重命名字段第五步 導出WGS geojson坐標第六步 導入EasyV 第一步&#xff1a;導入QGIS 第二步 坐標系轉換 第三步 集合修正 第四步 重命名字段 第五步 導出WGS geojson坐標 第六步 導入EasyV…

【es6】模版字面量/模版字符串,標簽函數/String.raw()靜態方法

模版字符串經常用&#xff0c;但是這個標簽函數的功能你肯定不知道&#xff0c;請看官網文檔 看完你需要知道 可以自定義標簽函數String.raw 的用法 唯一一個內置的模版字符串標簽函數第一個參數具有 raw 屬性的對象&#xff0c;值時一個類數組字符串對象模版字面量的緩存機制…

【vue vue-seamless-scroll】解決vue-seamless-scroll鼠標懸浮才滾動或者只滾動一次就失效的問題

解決問題&#xff1a;使用vue-seamless-scroll發現只有鼠標懸浮上去才滾動&#xff0c;而且滾動一次停止了 目標效果&#xff1a; 解決方案&#xff1a; 最后發現是因為數據需要在頁面掛載好就賦值&#xff0c;否則頁面在加載完成后&#xff0c;數據無法自動滾動。但因為數據…

c++:藍橋杯的基礎算法2(構造,模擬)+練習鞏固

目錄 構造 構造的基礎概念&#xff1a; 模擬 練習1&#xff1a;掃雷 練習2&#xff1a;灌溉 練習3&#xff1a;回文日期 構造 構造的基礎概念&#xff1a; 構造算法是一種用于解決特定問題的算法設計方法。在C語言中&#xff0c;構造算法通常涉及到創建一個函數或類來實…

ARM服務器上部署zookeeper集群

由于ARM服務器上部署zookeeper集群,會存在加載不到主類問題,現在把遇到的問題進行總結下,問題如下: [rootnode206 apache-zookeeper-3.5.10]# bin/zkServer.sh start ZooKeeper JMX enabled by default Using config: /data1/software/apache-zookeeper-3.5.10/bin/../conf/…

四、Burpsuite工具之proxy模塊詳解-intercept功能

前言&#xff1a; 過了一個年&#xff0c;感覺好久都沒有更新了&#xff0c;今天就從burpsuite的更新開始吧。 前面已經說過了burpsuite的安裝和proxy代理的配置&#xff0c;今天說一下proxy模塊中非常有用的intercept功能。 intercept功能介紹&#xff1a; intercept是攔截…

Spring之AOP源碼解析(中)

前言 在上一篇文章中,我們講解了Spring中那些注解可能會產生AOP動態代理,我們通過源碼發現,完成AOP相關操作都和ProxyFactory這個類有密切關系,這一篇我們將圍繞這個類繼續解析 演示 作用 ProxyFactory采用策略模式生成動態代理對象,具體生成cglib動態代理還是jdk動態代理,…

算法提升——LeetCode第385場周賽總結

題目 統計前后綴下標對 I 給你一個下標從0開始的字符串數組words。 定義一個布爾函數isPrefixAndSuffix&#xff0c;它接受兩個字符串參數str1和str2&#xff1a; 當str1同時是str2的前綴&#xff08;prefix&#xff09;和后綴&#xff08;suffix&#xff09;時&#xff0c…

APP的UI自動化demo(appium+java)

文章目錄 appium連接手機java代碼實現-第一版第二版-接入testng和隱式等待顯示等待 appium連接手機 準備工作 1、查看連接手機模擬器是否連接成功&#xff0c;獲取設備名稱 執行命令&#xff1a;adb devices 2、查看android內核版本號—>paltformVersion 執行命令&#xf…

MQL語言實現單元測試

文章目錄 一、單元測試是什么二、單元測試的過程三、為什么需要單元測試四、MQL測試代碼實現 一、單元測試是什么 單元測試是對軟件中最小可測單元&#xff08;如類或函數&#xff09;進行獨立驗證和檢查的過程。它是由開發工程師完成的&#xff0c;旨在確保每個單元的功能和邏…

Postman接口關聯實戰解析

在使用postman做接口測試時&#xff0c;有時候后面的接口需要獲取前面接口的某一個返回值做為請求參數&#xff0c;這時就可以使用關聯。 如從A接口提取出a字段的值&#xff0c;供B接口的b字段使用。 一個接口的返回報文如下&#xff1a; {"retCode": "0&quo…

SwiftUI 集合視圖(Grid)拖放交換 Cell 的極簡實現

概覽 自從 SwiftUI 橫空出世那天起&#xff0c;小伙伴們都感受到了它驚人的簡單與便捷。而在本課中&#xff0c;我們將會用一個小“栗子”更直觀的讓大家體驗到它無與倫比簡潔的描述性特質&#xff1a; 如上圖所示&#xff0c;我們在 SwiftUI 中實現了 Grid 中拖放交換 Cell 的…

基于SpringBoot + Layui的社區物業管理系統

項目介紹 社區物業管理系統是基于java編程語言&#xff0c;springboot框架&#xff0c;idea工具&#xff0c;mysql數據庫進行開發&#xff0c;本系統分為業主和管理員兩個角色&#xff0c;業主可以登陸系統&#xff0c;查看車位費用信息&#xff0c;查看物業費用信息&#xff0…

2個wordpress優化SEO主題模板

SEO優化wordpress主題 簡潔的SEO優化wordpress主題&#xff0c;效果好不好&#xff0c;結果會告訴你&#xff0c;適合SEO公司使用的主題。 https://www.jianzhanpress.com/?p2804 SEO優化海外WordPress主題 簡潔的SEO優化海外服務商WordPress主題&#xff0c;為中國制造202…

C# byte[]、struct、intptr、byte[]和byte*等的相互轉換

struct、byte[]互相轉換 //struct轉換為byte[] public static byte[] StructToBytes(object structObj) {int size Marshal.SizeOf(structObj);IntPtr buffer Marshal.AllocHGlobal(size);try{Marshal.StructureToPtr(structObj, buffer, false);byte[] bytes new byte[siz…

HTTP REST 方式調用WebService接口(wsdl)

一、WebService接口正常使用SOAP協議調用&#xff0c;測試時常采用SoapUI軟件調用&#xff0c;具體如下&#xff1a; 二、由于目前主流web服務逐漸轉換為RESTful的形式&#xff0c;且SOAP協議的實現也是基于HTTP協議&#xff0c;故存在通過HTTP調用WebService接口的可能 2.1 …

Flink雙流(join)

一、介紹 Join大體分類只有兩種&#xff1a;Window Join和Interval Join Window Join有可以根據Window的類型細分出3種&#xff1a;Tumbling(滾動) Window Join、Sliding(滑動) Window Join、Session(會話) Widnow Join。 &#x1f338;Window 類型的join都是利用window的機制…