用案例的方式解释 React 18 新特性——并发渲染、自动批处理等

⭐️ 本文首发自 前端修罗场(点击加入),是一个由 资深开发者 独立运行 的专业技术社区,我专注 Web 技术、Web3、区块链、答疑解惑、面试辅导以及职业发展博主创作的 《前端面试复习笔记》(点击订阅),广受好评,已帮助多位同学提升实力、拿到 offer。现在订阅,私聊博主即可获取一次 免费的模拟面试/简历指导服务,帮你评估知识点的掌握程度,获得更全面的学习指导意见!

React 18 于 2022 年 3 月发布。这个版本侧重于性能改进和渲染引擎的更新。同时,React 18 为并发渲染奠定了基础,未来的 React 功能将在此基础上构建。

在本文中,我将简要介绍 React 18,并通过案例解释并发渲染、自动批处理和 transitions 等几个主要概念。

React 18 功能概览

类别功能
概念并发
特性自动批处理,过渡等
APIscreateRoot, hydrateRoot, renderToPipeableStream, renderToReadableStream
HooksuseId, useTransition, useDeferredValue, useSyncExternalStore, useInsertionEffect
更新严格模式
废弃ReactDOM.render, renderToString

下面,我会更加详细地解释上面的功能与特性。首先,我们先升级到 React 18

升级到 React 18

首先执行如下命令:

npm install react react-dom

然后,在 index.js 中,将 ReactDOM.render 更改为 ReactDOM.createRoot 以创建 root 节点,并使用 root 节点渲染应用程序。

这是 React 17 中的样子:

import ReactDOM from 'react-dom';
import App from 'App';

const container = document.getElementById('app');

ReactDOM.render(<App />, container);

更新后,这是 React 18 中的样子:

import ReactDOM from 'react-dom';
import App from 'App';

const container = document.getElementById('app');

// 创建 root
const root = ReactDOM.createRoot(container);

//渲染
root.render(<App />);

并发

为了理解并发,这里有一个来自官方的例子:

假设我们需要给两个人打电话——Alice 和 Bob。 在非并发设置中,我们一次只能有一个呼叫。 我们会先打电话给 Alice,结束通话后,再打电话给 Bob。

当通话时间很短时这很好,但是如果与 Alice 的通话等待时间很长(例如等待),这可能是会是一个问题。

请添加图片描述

而,在并发设置中,我们可以打电话给 Alice,一旦我们被搁置,我们就可以打电话给 Bob

这并不意味着我们同时与两个人交谈。 它只是意味着我们可以同时有两个或多个并发调用,并决定哪个调用更重要

请添加图片描述

同样,在具有并发渲染的 React 18 中,React 可以中断、暂停、恢复或放弃渲染。 这允许 React 快速响应用户交互,即使它处于繁重的渲染任务中。

在 React 18 之前,渲染是一个单一的、不间断的、同步的事务,一旦渲染开始,就不能被中断。

React 18 引入了并发渲染的基础,为一些新功能,如suspense、流服务渲染和 transitions提供了支持。

React 18 新特性

自动批处理

React 18 具有自动批处理功能。 为了理解批处理,让我们参考一个官方的商店购物示例。

假设你正在为晚餐做意大利面。但是你发现你并没有做意大利面所需要的配料,因此你需要去商店里购买。

这时你开始做饭,发现你缺少一种配料,然后你就去商店里买配料,然后回来继续做饭。回来后却又发现你需要另一种配料,接着你又去商店买……然后再回来。这样下去,你自己可能先疯了。

在 React 中,当你调用 setState 时,批处理有助于减少在状态更改时发生的重新渲染次数。 以前,React 在事件处理程序中批量状态更新是这样的:

const handleClick = () => {
setCounter();
setActive();
setValue();
}
// 最后重新渲染一次。

但是,在事件处理程序之外发生的状态更新不会被批处理。 例如,如果有一个Promise或正在进行 api 调用,则不会批量更新状态。 像这样:

fetch('/network').then( () => {
setCounter(); // 重新渲染 1 次
setActive();  // 重新渲染 2 次
setValue();   // 重新渲染 3 次
});
//一共重新渲染 3次

如你所知,这样做,不是高性能的方式。 React 18 引入了自动批处理,它允许对所有状态更新进行批处理,即使在 Promise、setTimeouts 和事件回调中也是如此。 这显着减少了 React 必须在后台执行的工作。 React 将等待一个微任务完成,然后再重新渲染

自动批处理在 React 中是开箱即用的,但如果你想退出,你可以使用 flushSync

Transitions

Transitions 是React 18 引入的一个全新的并发特性。 它允许你将标记更新作为一个 transitions,这会告诉 React 它们可以被中断执行,并避免回到已经可见内容的 Suspense 降级方案

例如,当你在输入时,会发生两件事:先是输入时闪烁的光标,然后是在后台搜索数据。

如果你觉得向用户呈现搜索到的数据并不是紧急的,那么你可以把这项操作标记为 transitions。这样,React 将知道哪些更新优先。 这使得提升渲染性能更加容易。

使用上,在 React 中,可以使用 startTransition 将更新标记为transition。 下面是一个 typeahead 组件在使用transitions标记时的示例:

import { startTransition } from 'react';

// 紧急
setInputValue(input);

// 非紧急: 将内部的任何非紧急状态更新标记为 Transition
startTransition(() => {
  setSearchQuery(input);
});

transitions 与 防抖 或 setTimeout 有何不同?

  • 与 setTimeout 不同,startTransition 立即执行
  • setTimeout 有保证的延迟,而 startTransition 的延迟取决于设备的速度和其他紧急渲染
  • 与 setTimeout 不同,startTransition 更新可以被中断,并且不会冻结页面
  • 当标记为 startTransition 时,React 可以为你跟踪挂起状态

Suspense SSR

客户端渲染和服务端渲染

在客户端呈现的应用程序的过程中,会从服务器加载页面的 HTML 以及运行页面所需的所有 JavaScript。

但是,如果 JavaScript 包很大,或者连接速度很慢,那么这个过程可能需要很长时间。

在客户端呈现流程中,用户必须等待很长时间才能使页面变为交互式。
为了优化用户体验并避免用户坐在空白屏幕上,我们可以使用服务器渲染。

服务器渲染是一种技术,可以在服务器上渲染 React 组件的 HTML 输出并从服务器发送 HTML。 这让用户可以在加载 JS 包时以及在应用程序变得交互之前查看一些 UI。

在服务器渲染流程中,我们可以通过从服务器发送 HTML 更快地向用户显示有意义的数据
服务器渲染进一步增强了加载页面的用户体验并减少了交互时间。

在 React 18 之前,这部分通常是应用程序的瓶颈,并且会增加渲染组件所需的时间。

一个慢组件可以减慢整个页面的速度。这是因为服务器渲染要么全部,要么什么都没有。你不能告诉 React 推迟加载慢速组件,也不能告诉 React 为其他组件发送 HTML。

React 18 在服务器上增加了对 Suspense 的支持。在 suspense 的帮助下,可以将应用程序的慢速部分包装在 Suspense 组件中,告诉 React 延迟加载慢速组件。这也可以用于指定可以在加载时显示的加载状态

在 React 18 中,一个慢速组件不必减慢整个应用程序的渲染速度。使用 Suspense,可以告诉 React 首先发送其他组件的 HTML 以及占位符的 HTML。然后,当慢速组件准备好并获取其数据时,服务器渲染器将在同一流中弹出其 HTML

显示服务器上的图像可以允许慢速组件显示加载状态,而其他组件则完全呈现
通过这种方式,用户可以尽早看到页面的骨架,并随着更多的 HTML 到达而逐渐显示更多的内容。

所有这些都发生在页面上加载任何 JS 或 React 之前,这显着改善了用户体验和用户感知的延迟。

严格模式

React 18 中的严格模式将模拟安装、卸载和重新安装具有先前状态的组件。 这为将来的可重用状态奠定了基础,React 可以通过在卸载之前使用相同的组件状态重新安装树来立即安装前一个屏幕。

严格模式将确保组件对多次安装和卸载的效果具有弹性。

结尾

总而言之,React 18 为未来的发布奠定了基础,并专注于改善用户体验。

编程轨迹_
关注 关注
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
「原理篇」你真的了解 React18并发吗?
Web_boom的博客
05-11 1851
前言 前阵子,打磨已久的React18终于正式发布,其中最重要的一个更新就是并发(concurrency)。其他的新特性如Suspense、useTransition、useDeferredValue 的内部原理都是基于并发的,可想而知在这次更新中并发的重要性。 但是,并发究竟是什么?React团队引入并发又是为了解决哪些问题呢?它到底是如何去解决的呢?前面提到的React18新特性并发之间又有什么关系呢? 相信大家在看官方文档或者看其他人描述React新特性时,或多或少可能会对以上几个问题产生疑问。因此
React渲染异步无状态功能组件-JavaScript开发
05-26
异步React渲染异步无状态功能组件安装npm install --save异步React器用法asyncReactor(component:Function,loader ?: Component,error ?: Component):组件异步React渲染异步无状态功能组件安装npm install --save async-reactor用法asyncReactor(component:Function,loader ?: Component,error ?: Component):组件名称类型描述组件Function(async)要渲染的异步组件loader(可选)Component将一直显示,直到第一个组件渲染错误(可选)组件发生错误时将显示。返回值是常规组件。 Exa
React入门小项目——美食清单
07-18
React实现美食清单小demo,包含动态添加DOM、使用filter函数过滤数据、标签切换等等小技术
面试常问的-React 18新特性
weixin_42429220的博客
02-04 299
2022年3月发布的React 18带来了一系列新特性和更新,极大地增强了React应用程序的功能和性能。这个版本为并发渲染奠定了基础,这是React未来更新的基石。下面我们来深入了解React 18的关键特性和变化,包括技术细节和代码示例。
react 18更新知识盘点(2024面试)
qq_16546829的博客
04-04 698
这个更新不仅解决了一个在 React 17 及更低版本中的存在的问题,而且它会在 React 18 中发挥更重要的作用,因为新的流式服务端渲染响应 HTML 的方式将是无序的,需要独一无二的 id 作为索引。相反,React 会延迟渲染,直到有足够的数据,以防止出现加载状态错误。但是直接用axios或者fetch是无法进入suspense的fallback的,但是react提供了一个库供我们使用react-cache(暂不建议使用的),它具体是做什么的,原理是什么,我们后面在讨论,这里先体验一下效果如何。
React 18 中的并发
weixin_45727472的博客
01-15 867
并发是一种执行模型,其中程序的不同部分可以无序执行,而不会影响最终结果。您可能听说过不同风格的并发性多线程或多处理。由于浏览器中的 JavaScript 只能访问一个线程(worker 在单独的线程中运行,但它们与 React 并不真正相关),因此我们不能使用多线程来并行我们的一些计算。为了确保资源的最佳使用和页面的响应能力,JS 必须采用不同的并发模型:协作式多任务处理。这听起来可能过于复杂,但不要害怕,您已经熟悉这个模型并且肯定已经使用过它。我说的是 -s 和 /。
8.react18并发模式与startTransition(搜索高亮思路)
小李科技
08-29 746
React 18引入并发模式,它允许你将标记更新作为一个transitions,这会告诉React他们可以被中断执行.这样可以将紧急任务先更新,不紧急任务后更新.React 18 之前,渲染是一个单一的,不间断的,同步的事务,一旦渲染开始,就不能被中断。//第二个任务(不紧急的任务)// 匹配输入的选项并且高亮。
React 并发渲染的前世今生
m0_69860228的博客
05-10 368
2161 天! 这是 React 团队从计划为 React 增加 并发渲染 的能力,到 React 18 可用版本发布所花费的时间。 为啥中间花费了这么长的时间?中间又发生了哪些有趣的故事?我们回到 2016 年,来回顾一下 React 并发渲染诞生的过程! 今天这篇文章会以更轻松的方式带大家看整体的演进之路,不会涉及太多的技术性,读起来会更简单,相信看完这篇文章再去看之前的问会有不一样的理解。 浏览器的瓶颈 早在 2016 年,React 就已经开始在前端届爆火了。React 团队始终有一个
react18并发渲染
文摘资讯
07-12 723
并发渲染(concurrent rendering)当然你也可以选择性的使用 React18 的一些新功能,React18 加入了一个主要的可选机制,“并发渲染(concurrent re...
React 18 并发模式:提升应用性能和用户体验
uijj556的博客
04-19 1039
React 18并发模式是一个非常有用的功能,它可以提高应用程序的性能和用户体验,使得应用程序可以更加高效地响应用户的操作,并保持流畅的体验。对于开发者们来说,在使用并发模式时需要注意一些细节和问题,确保应用程序能够正常运行。但是,随着并发模式的不断改进和普及,相信在未来,React并发模式将会成为 React 应用程序开发中的标配。
React18并发模式
玉案轩窗的博客
06-04 1090
React18版本的发布标志着并发模式的正式应用,实际上自React16引入Fiber架构后,之后的版本工作之一就是为了后续并发模式的引入做铺垫。串行:吃饭和看剧两件事存在先后顺序,即吃饭完后看剧并行:吃饭和看剧两件事同时执行,即吃饭的同时看剧并发:吃饭和看剧交替进行,即是一会吃饭一会看剧React并发模式实际上就是让渲染可以中断从而响应用户操作,之后再恢复执行之前的渲染逻辑,说起来简单但实际上很复杂需要考虑很多事情,例如任务拆分、执行时长把控、整体调度等等。
30分钟精通React今年最劲爆的新特性——React Hooks
10-17
主要介绍了30分钟精通React今年最劲爆的新特性——React Hooks,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
react pro——————————
04-14
react pro——————————
十分钟带你快速了解React16新特性
08-28
主要介绍了十分钟带你快速了解React16新特性,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
详解react阻止无效重渲染的多种方式
10-17
主要介绍了详解react阻止无效重渲染的多种方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
React 18并发渲染:颠覆传统的性能飞跃
最新发布
wujiayu31415的博客
04-22 626
同时,current tree 中保存着上一次渲染的结果,用于在渲染过程中进行比对和更新。React 18 引入的并发渲染(Concurrent Rendering)是一个革命性的特性,它改变了 React 应用的渲染方式,使得渲染过程更加高效且可控。并发渲染的核心原理在于将渲染任务拆分为多个可中断和可恢复的小任务,并根据优先级进行调度。这个更新现在被标记为非紧急的,并将在浏览器空闲时执行。,我们实际上是在告诉 React:“这个更新不是非常紧急,你可以在其他高优先级的任务完成后,或者浏览器空闲时再进行。
React 重要的一次重构:认识异步渲染架构 Fiber
weixin_34072458的博客
11-15 379
Diff 算法 熟悉 react 的朋友都知道,在 react 中有个核心的算法,叫 diff 算法。web 界面由 dom 树组成,不同的 dom 树会渲染出不同的界面。react 使用 virtual dom 来表示 dom 树,而 diff 算法就是用于比较 virtual dom 树的区别,并更新界面需要更新的部分。diff 算法和 virtual dom 的完美结合的过程被称为 reco...
奇舞周刊第 446 期:React 并发渲染的前世今生
奇舞周刊
05-13 195
记得点击文章末尾的“阅读原文”查看哟~下面先一起看下本期周刊摘要吧~奇舞推荐■ ■ ■React 并发渲染的前世今生2161天!这是 React 团队从计划为 React 增加并发渲染的能力,到 React 18 可用版本发布所花费的时间。为啥中间花费了这么长的时间?中间又发生了哪些有趣的故事?我们回到2016年,来回顾一下 React 并发渲染诞生的过程!如...
React 18新特性详解:Hooks、并发模式、自定义渲染
奇妙的Bug之旅
10-19 529
并发模式是React 18中引入的一项新功能,它可以让我们更好地控制组件的更新顺序,从而提高应用的性能。在并发模式下,React会尝试将所有可以同时进行的更新合并在一起执行,而不是逐个执行。value是一个函数,用于计算延迟的值。当组件重新渲染时,如果value没有发生变化,那么useDeferredValue将直接返回之前缓存的结果,而不是重新计算。React 18React团队发布的最新版本,它引入了许多新特性和改进,包括Hooks的增强、并发模式、自定义渲染器等。一、Hooks的增强。
我想调一个接口用来渲染页面用react方式渲染有没有
07-12
有的,你可以使用React渲染页面。React是一个用于构建用户界面的JavaScript库,它提供了一种声明式的方式来创建可复用的组件。 要调用一个接口来渲染页面,你可以使用React的生命周期方法和钩子函数来获取接口...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 目前最流行的 5 大 Vue 动画库,使用后太炫酷了 23838
  • 【RESTful】RESTful API 接口设计规范 | 示例 21975
  • 【工具】抓包工具 Fiddler 使用教程 20846
  • JS 合并数组的三大方式 18721
  • 【Django】Python+Django 图文教程 18415

分类专栏

  • 前端面试复习笔记 付费 60篇
  • Web3 实战教程 付费 17篇
  • 前端面试面经 37篇
  • Rust 易学教程 2篇
  • Rust
  • Java 成神之路
  • React | Vue 30篇
  • Web3 5篇
  • 机器学习 6篇
  • 实战 20篇
  • Web3D 3篇
  • javascript 44篇
  • 综合 58篇
  • web性能 22篇
  • WebVR 1篇
  • 知书达礼阅读社 11篇
  • 服务端语言 4篇
  • 区块链链习社 7篇
  • 数据可视化 13篇
  • 阅读 15篇
  • CSS 14篇
  • python 5篇
  • D3 14篇
  • 数据挖掘 4篇
  • BackboneJs 11篇
  • 算法与数据结构 4篇
  • php 2篇
  • 程序人生 6篇
  • 数据库 1篇
  • 网络 4篇
  • 交互体验设计 2篇
  • 区块链 7篇
  • 移动开发 17篇
  • 运维 6篇
  • 翻译 3篇

最新评论

  • 【BabylonJs】在 Vue3 中使用 BabylonJs 开发 3D 是什么体验

    Mclark: 没入门就想放弃了

  • 【scrapy】scrapy爬取数据指南

    刘刘刘眼泪: 在终端输入执行的,终于成功✌

  • 目前最流行的 5 大 Vue 动画库,使用后太炫酷了

    编程轨迹_: 这个:https://www.npmjs.com/package/v-wave

  • 目前最流行的 5 大 Vue 动画库,使用后太炫酷了

    编程轨迹_: https://www.npmjs.com/package/v-wave

  • 目前最流行的 5 大 Vue 动画库,使用后太炫酷了

    a濯: 大佬可以发一下v-wave的官网地址码,没有找到表情包

大家在看

  • 基于Android的跳蚤市场 893
  • 手机版XMind思维导图v24.04.11解锁付费版 147
  • BitComet v2.08解锁全功能豪华版 – 一款高效专业的老牌国产BT下载软件 348
  • 华为od机考_精准核酸检测_Java(深度优先搜索)
  • springboot基于Android的记录生活APP 513

最新文章

  • ag-Grid:对数据变化的单元格进行高亮显示
  • 比较两次从接口获取的数据,并找出变动的字段
  • ag-grid 组件,当单元格的值发生变化的时候,高亮这个单元格
2024年5篇
2023年30篇
2022年157篇
2021年13篇
2020年8篇
2019年38篇
2018年56篇
2017年27篇
2016年26篇
2015年27篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程轨迹_

期望和你分享一杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司铜陵网站建设张家界网站搭建报价毕节网站推广方案哪家好呼和浩特网站排名优化报价淮南网站推广工具价格株洲网络营销关键词排名包年推广哪家好保山企业网站制作多少钱迁安品牌网站设计哪家好娄底关键词排名公司武汉外贸网站设计哪家好宜宾百度爱采购价格潮州关键词排名包年推广推荐防城港外贸网站设计哪家好大鹏至尊标王报价连云港外贸网站设计推荐丽江百度标王张家界seo排名公司拉萨高端网站设计公司泸州网站优化按天扣费价格醴陵关键词排名推荐昭通企业网站设计多少钱资阳营销型网站建设多少钱那曲企业网站建设多少钱巢湖百度竞价价格珠海网页设计价格许昌建设网站海南建站哪家好南京网站推广工具报价孝感SEO按效果付费报价歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化