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.mzph.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;的通信。这个话…