react的fiber 用法

在 React 里,Fiber 是 React 16.x 及后續版本采用的協調算法,它把渲染工作分割成多個小任務,讓 React 可以在渲染過程中暫停、恢復和復用任務,以此提升渲染性能與響應能力。在實際開發中,你無需直接操作 Fiber 節點,不過你可以借助 React 的 API 來利用 Fiber 的特性。下面從幾個方面為你講解 Fiber 的用法。

1. 異步渲染

Fiber 架構實現了異步渲染,這意味著 React 能在渲染期間暫停工作,處理高優先級的事件。你可以通過 React.lazySuspense 來實現代碼分割和異步加載組件。

import React, { lazy, Suspense } from 'react';// 異步加載組件
const LazyComponent = lazy(() => import('./LazyComponent'));function App() {return (<div><Suspense fallback={<div>Loading...</div>}><LazyComponent /></Suspense></div>);
}export default App;

2. 優先級調度

Fiber 架構支持任務優先級調度,借助 React.unstable_runWithPriority 函數,你能設置不同任務的優先級。

import React, { unstable_runWithPriority as runWithPriority } from 'react';function App() {const handleClick = () => {runWithPriority('userBlocking', () => {// 高優先級任務console.log('High priority task');});runWithPriority('normal', () => {// 普通優先級任務console.log('Normal priority task');});};return (<button onClick={handleClick}>Run tasks with different priorities</button>);
}export default App;

3. 時間切片

Fiber 利用時間切片技術,把渲染工作拆分成多個小任務,避免長時間阻塞主線程。在 React 中,你可以使用 React.memo 來對組件進行記憶化,減少不必要的渲染。

import React from 'react';// 記憶化組件
const MemoizedComponent = React.memo(({ data }) => {return <div>{data}</div>;
});function App() {const [count, setCount] = React.useState(0);return (<div><button onClick={() => setCount(count + 1)}>Increment</button><MemoizedComponent data={count} /></div>);
}export default App;

總結

  • 異步渲染:借助 React.lazySuspense 實現代碼分割和異步加載組件。
  • 優先級調度:使用 React.unstable_runWithPriority 函數設置任務優先級。
  • 時間切片:通過 React.memo 記憶化組件,減少不必要的渲染。

Fiber 是 React 16.x 及以后版本所采用的協調算法,其核心目標在于提升 React 應用的渲染性能和響應能力。下面詳細介紹 React Fiber 的核心技術點:

核心技術

1. 架構目標與動機

  • 渲染性能優化:傳統的協調算法在處理大型組件樹時,可能會出現長時間阻塞主線程的情況,導致頁面卡頓。Fiber 通過將渲染任務拆分成多個小任務,允許在渲染過程中暫停、恢復和重新排序任務,避免長時間占用主線程,從而提升渲染性能。
  • 優先級調度:Fiber 架構支持任務優先級調度,能夠根據任務的重要性和緊急程度對任務進行排序,優先處理高優先級的任務,如用戶交互事件,提高應用的響應能力。

2. 核心概念

  • Fiber 節點:Fiber 節點是 Fiber 架構中的基本單元,每個 React 元素都對應一個 Fiber 節點。Fiber 節點包含了組件的狀態、屬性、副作用等信息,同時還維護了與其他 Fiber 節點的關系,如父節點、子節點和兄弟節點。
  • Fiber 樹:由多個 Fiber 節點組成的樹形結構,代表了 React 應用的組件樹。Fiber 樹有兩棵,分別是 current 樹和 workInProgress 樹。current 樹表示當前屏幕上顯示的內容,workInProgress 樹是正在構建的新樹,構建完成后會替換 current 樹。
  • 任務調度:Fiber 架構將渲染任務拆分成多個小任務,每個任務對應一個 Fiber 節點的處理。調度器會根據任務的優先級和時間片來決定何時執行任務,確保高優先級任務能夠及時處理。

3. 工作流程

  • 調度階段(Scheduler):當組件的狀態或屬性發生變化時,React 會創建一個新的 workInProgress 樹,并將任務添加到調度器中。調度器會根據任務的優先級和時間片來決定何時執行任務。如果當前有高優先級的任務(如用戶交互事件),調度器會暫停當前正在執行的任務,優先處理高優先級任務。
  • 協調階段(Reconciler):調度器選擇一個任務后,會將其交給協調器處理。協調器會遞歸遍歷 workInProgress 樹,比較 current 樹和 workInProgress 樹的差異,標記出需要更新、插入或刪除的節點。這個過程是可以暫停和恢復的,因為每個 Fiber 節點的處理都是一個獨立的小任務。
  • 提交階段(Renderer):當協調階段完成后,所有的差異都已經標記好。提交階段會將這些差異一次性應用到真實 DOM 上,更新頁面顯示。提交階段是不可中斷的,確保頁面的一致性。

4. 優先級調度

  • 任務優先級:Fiber 架構定義了多種任務優先級,如 ImmediatePriority(最高優先級,立即執行)、UserBlockingPriority(用戶交互相關的高優先級任務)、NormalPriority(普通優先級任務)、LowPriority(低優先級任務)和 IdlePriority(空閑時執行的任務)。
  • 優先級調度算法:調度器會根據任務的優先級和時間片來決定任務的執行順序。高優先級的任務會優先執行,并且可以中斷低優先級的任務。當高優先級任務執行完成后,低優先級任務會繼續執行。

5. 異步渲染

  • 時間切片:Fiber 利用時間切片技術,將渲染工作拆分成多個小任務,每個任務執行一段時間后暫停,將控制權交還給主線程,讓主線程有機會處理其他事件,如用戶交互、動畫等。這樣可以避免長時間阻塞主線程,提高應用的響應能力。
  • Suspense 和 Lazy 組件:Fiber 架構支持異步加載組件,通過 React.lazySuspense 可以實現代碼分割和異步渲染。當組件需要異步加載時,Suspense 組件可以顯示一個加載提示,直到組件加載完成。

6. 副作用處理

  • 副作用(Effect):在 React 中,副作用是指那些會影響外部環境的操作,如數據獲取、訂閱、DOM 操作等。Fiber 架構通過 useEffectuseLayoutEffect 等 Hooks 來處理副作用。
  • 副作用調度:副作用的執行也遵循優先級調度原則。useEffect 會在提交階段之后異步執行,不會阻塞頁面渲染;useLayoutEffect 會在提交階段同步執行,用于處理需要立即更新 DOM 的副作用。

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

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

相關文章

FPGA前瞻篇-數字電路基礎-邏輯門電路設計

模擬信號&#xff1a; 一條隨時間連續變化、平滑波動的曲線&#xff0c;比如正弦波。 數字信號&#xff1a; 一條只有高低兩個狀態&#xff08;0和1&#xff09;&#xff0c;跳變清晰的方波曲線。 在 IC 或 FPGA 的邏輯設計中&#xff0c;我們通常只能處理數字信號&#xff0…

RabbitMQ 基礎概念(隊列、交換機、路由鍵、綁定鍵、信道、連接、虛擬主機、多租戶)介紹

本文是博主在梳理 RabbitMQ 知識的過程中&#xff0c;將所遇到和可能會遇到的基礎知識記錄下來&#xff0c;用作梳理 RabbitMQ 的整體架構和功能的線索文章&#xff0c;通過查找對應的知識能夠快速的了解對應的知識而解決相應的問題。 文章目錄 一、RabbitMQ 是什么&#xff1f…

機器學習第一篇 線性回歸

數據集&#xff1a;公開的World Happiness Report | Kaggle中的happiness dataset2017. 目標&#xff1a;基于GDP值預測幸福指數。&#xff08;單特征預測&#xff09; 代碼&#xff1a; 文件一&#xff1a;prepare_for_traning.py """用于科學計算的一個庫…

Java面試高頻問題(29-30)

二十九、全鏈路壓測&#xff1a;數據隔離與流量 關鍵技術點 1. 流量染色&#xff1a;通過Header注入X-Test-TraceId標識壓測流量 2. 影子庫表&#xff1a;通過ShardingSphere實現數據隔離 3. 熔斷降級&#xff1a;壓測流量觸發異常時自動切換回生產數據源 數據隔離方案對比 …

Python常用的第三方模塊之數據分析【pdfplumber庫、Numpy庫、Pandas庫、Matplotlib庫】

【pdfplumber庫】從PDF文件中讀取內容 import pdfplumber #打開PDF文件 with pdfplumber.open(DeepSeek從入門到精通(20250204).pdf) as pdf:for i in pdf.pages: #遍歷頁print(i.extract_text()) #extract_text()方法提取內容print(f----------------第{i.page_number}頁結束…

長短板理論——AI與思維模型【83】

一、定義 長短板理論思維模型&#xff0c;也被稱為木桶原理&#xff0c;是指一只木桶能盛多少水&#xff0c;并不取決于最長的那塊木板&#xff0c;而是取決于最短的那塊木板。該理論將木桶視為一個整體系統&#xff0c;各個木板代表著系統的不同組成部分或要素&#xff0c;強…

2025藍橋省賽c++B組第二場題解

前言 這場的題目非常的簡單啊&#xff0c;至于為什么有第二場&#xff0c;因為當時河北正在刮大風被迫停止了QwQ&#xff0c;個人感覺是歷年來最簡單的一場&#xff0c;如果有什么不足之處&#xff0c;還望補充。 試題 A: 密密擺放 【問題描述】 小藍有一個大箱子&#xff0…

【數據結構與算法】從完全二叉樹到堆再到優先隊列

完全二叉樹 CBT 設二叉樹的深度為 h , 若非最底層的其他各層的節點數都達到最大個數 , 最底層 h 的所有節點都連續集中在左側的二叉樹叫做 完全二叉樹 . 特點 對任意節點 , 其右分支下的葉子節點的最底層為 L , 則其左分支下的葉子節點的最低層一定是 L 或 L 1 .完全二叉樹…

Leetcode:1. 兩數之和

題目 給定一個整數數組 nums 和一個整數目標值 target&#xff0c;請你在該數組中找出 和為目標值 target 的那 兩個 整數&#xff0c;并返回它們的數組下標。 你可以假設每種輸入只會對應一個答案&#xff0c;并且你不能使用兩次相同的元素。 你可以按任意順序返回答案。 示…

flume整合kafka

需求一&#xff1a; 啟動flume 啟動kafka消費者&#xff0c;驗證數據寫入成功 新增測試數據 需求二&#xff1a; 啟動Kafka生產者 啟動Flume 在生產者中寫入數據

Hbase集群管理與實踐

一、HBase集群搭建實戰 1.1 環境規劃建議 硬件配置基準(以10節點集群為例): 角色CPU內存磁盤網絡HMaster4核16GBSSD 200GB(系統盤)10GbpsRegionServer16核64GB124TB HDD(JBOD)25GbpsZooKeeper4核8GBSSD 500GB10Gbps1.2 關鍵配置項示例(hbase-site.xml) <configu…

STM32 開發 - stm32f10x.h 頭文件(內存映射、寄存器結構體與宏、寄存器位定義、實現點燈案例)

概述 STM32F10x.h 是 STM32F1 系列微控制器的核心頭文件&#xff0c;提供了所有外設寄存器的定義和內存映射 一、內存映射 #define PERIPH_BASE ((uint32_t)0x40000000)#define APB1PERIPH_BASE PERIPH_BASE #define APB2PERIPH_BASE (PERIPH_BASE 0x…

QEMU源碼全解析 —— 塊設備虛擬化(23)

接前一篇文章:QEMU源碼全解析 —— 塊設備虛擬化(22) 本文內容參考: 《趣談Linux操作系統》 —— 劉超,極客時間 《QEMU/KVM源碼解析與應用》 —— 李強,機械工業出版社 特此致謝! QEMU啟動過程中的塊設備虛擬化 上一回解析了qcow2格式對應的qcow2_open函數,本回解…

【PCB工藝】推挽電路及交越失真

推挽電路(Push-Pull Circuit) 推挽電路(Push-Pull Circuit) 是一種常用于功率放大、電機驅動、音頻放大等場合的電路結構,具有輸出對稱、效率高、失真小等優點。 什么是推挽電路? 推挽是指:由兩種極性相反的器件(如 NPN 和 PNP、NMOS 和 PMOS)交替導通,一個“推”電…

RD電子實驗記錄本選用貼士A-B-C

傳統的實驗記錄本&#xff0c;令人又愛又恨本 如何挑選電子實驗室記錄本&#xff08;ELN&#xff09;的品牌/服務商/供應商&#xff1f; 電子實驗記錄本&#xff0c;又名為ELN&#xff0c;Electronic lab notebook&#xff0c;enotebook&#xff0c;研發電子管理系統&#xf…

Qt實戰之將自定義插件(minGW)顯示到Qt Creator列表的方法

Qt以其強大的跨平臺特性和豐富的功能&#xff0c;成為眾多開發者構建圖形用戶界面&#xff08;GUI&#xff09;應用程序的首選框架。而在Qt開發的過程中&#xff0c;自定義插件能夠極大地拓展應用程序的功能邊界&#xff0c;讓開發者實現各種獨特的、個性化的交互效果。想象一下…

java基礎之枚舉和注解

枚舉 簡介 枚舉&#xff1a;enumeration&#xff0c;jdk1.5中引入的新特性&#xff0c;用于管理和使用常量 入門案例 第一步&#xff1a;定義枚舉&#xff0c;這里定義一個動物類&#xff0c;里面枚舉了多種動物 public enum AnimalEnum {CAT, // 貓DOG, // 狗PIG // …

2.3java運算符

運算符 1. 算術運算符 算術運算符用于執行基本的數學運算&#xff0c;像加、減、乘、除等。 運算符描述示例加法int a 5 3; // a 的值為 8-減法int b 5 - 3; // b 的值為 2*乘法int c 5 * 3; // c 的值為 15/除法int d 6 / 3; // d 的值為 2%取模&#xff08;取余&…

升級 Spring Boot CLI

&#x1f31f; 升級 Spring Boot CLI 1?? &#x1f504; 通過包管理器升級 使用對應包管理器命令&#xff08;如 brew upgrade&#xff09; 2?? &#x1f4e5; 手動安裝升級 遵循 標準安裝說明 注意更新 PATH 環境變量移除舊版本路徑 &#x1f517; 鏈接原文&#xff1a…

如何輕松將RS232轉為Profibus DP,提升PLC效率?

如何輕松將RS232轉為Profibus DP&#xff0c;提升PLC效率&#xff1f; 今天&#xff0c;我們就來聊聊一個工業自動化中常見的應用場景&#xff1a;如何通過興達易控RS232轉Profibus DP網關&#xff0c;實現流量泵與PLC&#xff08;可編程邏輯控制器&#xff09;的通信。這個話…