0

0

来来来,尝试一下 React 18 !

雪夜

雪夜

发布时间:2025-10-04 10:03:01

|

955人浏览过

|

来源于php中文网

原创

来来来,尝试一下 React 18 !

react 团队最近发布了 react 18 的 alpha 版本。这个版本主要是增强 react 应用程序的 并发渲染 能力,你可以在 react 18 中尝试体验以下几个新特性:

新的 ReactDOM.createRoot() API(替换 ReactDOM.render())新的 startTransition API(用于非紧急状态更新)渲染的自动批处理优化(主要解决异步回调中无法批处理的问题)支持 React.lazy 的 全新 SSR 架构(支持 <suspense></suspense> 组件)
来来来,尝试一下 React 18 !

这不,这个版本才刚刚发布社区里已经有很多小伙伴已经跃跃欲试了,我也迫不及待跟着社区的大佬们一起尝试了一下。

来来来,尝试一下 React 18 !

感兴趣的小伙伴们可以一起跟着我的记录来试一下:

安装 React 18 Alpha

想要在你的项目里试用 React 18 Alpha,可以尝试执行下面的命令:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">npm install react@alpha react-dom@alpha# oryarn add react@alpha react-dom@alpha</code>

如果你是使用 Create React App 初始化的项目,你可能会遇到一个由于 react-scripts 引起的 could not resolve dependency 错误:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">Could not resolve dependency:peer react@">= 16" from react-scripts@4.0.3</code>

你可以在安装的时候尝试加上 --force 来解决这个问题:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">npm install react@alpha react-dom@alpha --force</code>
ReactDOM.createRoot()

在 React 18 版本中,ReactDOM.createRoot() 替代了通常作为程序入口的 ReactDOM.render() 方法。

这个方法主要是防止 React 18 的不兼容更新导致你的应用程序崩溃。

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">import React from 'react';import ReactDOM from 'react-dom';import App from './App';const container = document.getElementById('root');// Create a root.const root = ReactDOM.createRoot(container);// Render the top component to the root.root.render(<App />);</code>
渲染的自动批处理

React 有一道经典面试题,setState 到底是同步的还是异步的,我面试的时候也会经常问,具体的我在两年前的一篇文章中有介绍过:

由实际问题探究setState的执行机制

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">class Example extends React.Component {  constructor() {    super();    this.state = {      val: 0    };  }    componentDidMount() {    this.setState({val: this.state.val + 1});    console.log(this.state.val);       this.setState({val: this.state.val + 1});    console.log(this.state.val);       setTimeout(() => {      this.setState({val: this.state.val + 1});      console.log(this.state.val);       this.setState({val: this.state.val + 1};      console.log(this.state.val);      }, 0);  }  render() {    return null;  }};</code>

比如上面的代码,我们来考虑一下两种情况:

假设 React 完全没有批处理机制,那么执行一个 setState 就会立即触发一次页面渲染,打印顺序应该是 1、2、3、4假设 React 有一个完美的批处理机制,那么应该等整个函数执行完了之后再统一处理所有渲染,打印顺序应该是 0、0、0、0

实际上,在 React 18 版本之前,上面代码的打印顺序是 0、0、2、3

出现这个问题的主要原因就是在 React 的事件函数和异步回调中的状态批处理机制不一样。在异步回调外面,能够将所有渲染合并成一次,异步回调里面,则不会合并,会渲染多次。

实际上,在大部分的场景下,我们都需要在调用一个接口或者做了一些其他事情之后,再去回调函数里更新状态,上面的批处理机制就会显得非常鸡肋。

现在,React 18 版本解决了这个问题,无论你是在 Promise、setTimeout、或者其他异步回调中更新状态,都会触发批处理,上面的代码真的就会一直打印 0、0、0、0 了!

来来来,尝试一下 React 18 !

通常情况下,批处理是没什么问题的,但是有可能在某些特殊的需求(比如某个状态更改后要立刻从 DOM 中获取一些内容)下不太合适,我们可以使用 ReactDOM.flushSync() 退出批处理:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">import { flushSync } from 'react-dom'; // Note: react-dom, not reactfunction handleClick() {  flushSync(() => {    setCounter(c => c + 1);  });  // React has updated the DOM by now  flushSync(() => {    setFlag(f => !f);  });  // React has updated the DOM by now}</code>

Ricky 在这篇文章(https://github.com/reactwg/react-18/discussions/21) 详细介绍了 Automatic batching ,感兴趣可以一起到评论区讨论。

来来来,尝试一下 React 18 !
SSR 下的懒加载支持

React.lazy 函数能让你像渲染常规组件一样处理动态引入组件。React.lazy 接受一个函数,这个函数需要动态调用 import()。它必须返回一个 Promise,该 Promise 需要 resolve 一个 default export 的 React 组件。

靠岸学术
靠岸学术

一款集翻译,阅读,文献管理于一体的英文文献阅读器

下载
代码语言:javascript代码运行次数:0运行复制
<code class="javascript">const MonacoEditor = React.lazy(() => import('react-monaco-editor'));</code>

React.lazy 必须要配合 <suspense></suspense> 才能更好的使用,在 Suspense 组件中渲染 lazy 组件,可以使用在等待加载 lazy 组件时做优雅降级(比如渲染一些 loading 效果 )。fallback 属性接受任何在组件加载过程中你想展示的 React 元素。

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">const OtherComponent = React.lazy(() => import('./OtherComponent'));function MyComponent() {  return (    // Displays <Spinner> until OtherComponent loads    <React.Suspense fallback={<Spinner />}>      <div>        <OtherComponent />      </div>    </React.Suspense>  );}</code>

React 18 以前, SSR 模式下是不支持使用 Suspense 组件的,而在 React 18 中服务端渲染的组件也支持使用 <suspense></suspense> 了:如果你把组件包裹在了 <suspense></suspense>中,服务端首先会把 fallback 中的组件作为 HTML 流式传输,一旦主组件加载完成,React 会发送新的 HTML 来替换该组件。

代码语言:javascript代码运行次数:0运行复制
<code class="javascript"><Layout>   < Article />   <Suspense fallback={<Spinner />}>     <Comments />   </Suspense> </Layout></code>

比如上面的代码,<article></article> 组件首先会被渲染,<comments></comments> 组件将被 fallback 替换为 <spinner></spinner> 。一旦 <comments></comments> 组件加载完成后,React 会才将其发送到浏览器,替换 <spinner></spinner> 组件。

来来来,尝试一下 React 18 !

Dan Abramov 在这篇文章(https://github.com/reactwg/react-18/discussions/37) 中详细介绍了这个机制,感兴趣可以到评论区一起讨论。

来来来,尝试一下 React 18 !
startTransition API

startTransition 是 React 18 新增加的一个 API,它可以让你区分 非紧急 的状态更新。

比如现在有这样一个场景:我们要去 Input 框输入一个值,然后下面需要同时给出通过我们输入后的值过滤出来的一些数据。

来来来,尝试一下 React 18 !

因为你每次需要动态渲染出过滤后的值,所以你可能会将输入的值存储在一个 state 中,你的代码可能是下面这样的:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">setInputValue (input) ; setSearchQuery (input) ;</code>

首先用户输入上去的值肯定是需要立刻渲染出来的,但是过滤出来的联想数据可能不需要那么快的渲染,如果我们不做任何额外的处理,在 React 18 之前,所有更新都会立刻被渲染。

如果你的原始数据非常多,那么每次输入新的值后你需要进行的计算量(根据输入的值过滤出符合条件的数据)就非常大,所以每次用户输入后可能会有卡顿现象。

来来来,尝试一下 React 18 !

所以,在以前我们可能会自己去加一些防抖这样的操作去人为的延迟过滤数据的计算和渲染。

新的 startTransition API 可以让我们把数据标记成 transitions 状态。

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">import { startTransition } from 'react';// Urgent: Show what was typedsetInputValue(input);// Mark any state updates inside as transitionsstartTransition(() => {  // Transition: Show the results  setSearchQuery(input);});</code>

所有在 startTransition 回调中的更新都会被认为是 非紧急处理,如果出现更紧急的更新(比如用户又输入了新的值),则上面的更新都会被中断,直到没有其他紧急操作之后才会去继续执行更新。

同时,React 还给我们提供了一个带有 isPending 过渡标志的 Hook

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">import  {  useTransition  }  from  'react' ; const  [ isPending ,  startTransition ]  =  useTransition ( ) ;</code>

你可以使用它和一些 loading 动画结合使用:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">{ isPending  &&  < Spinner  / > }</code>

Ricky 在这篇文章(https://github.com/reactwg/react-18/discussions/41) 详细介绍了 startTransition ,感兴趣可以一起到评论区讨论。

来来来,尝试一下 React 18 !
React 18 发布计划

React 18 官方介绍(https://github.com/reactwg/react-18/discussions/4)中提到的其他两个 API useDeferredValue<suspenselist></suspenselist> 还没 released ,我们下次再用,下面是 React 18 的发布时间表:

React 18 Alpha 版本:现在就能用公开的 Beta 版:至少在 Alpha 版本后的几个月RC 版本:至少在 Beta 版发布后的几周正式版:至少在 RC 版本发布之后的几周参考https://github.com/reactwg/react-18/discussions/4https://github.com/reactwg/react-18/discussions/41https://github.com/reactwg/react-18/discussions/37https://blog.bitsrc.io/trying-out-react-18-alpha-release-bad9aed12bee

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1954

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

658

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2401

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

47

2026.01.19

default gateway怎么配置
default gateway怎么配置

配置default gateway的步骤:1、了解网络环境;2、获取路由器IP地址;3、登录路由器管理界面;4、找到并配置WAN口设置;5、配置默认网关;6、保存设置并退出;7、检查网络连接是否正常。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

236

2023.12.07

DOM是什么意思
DOM是什么意思

dom的英文全称是documentobjectmodel,表示文件对象模型,是w3c组织推荐的处理可扩展置标语言的标准编程接口;dom是html文档的内存中对象表示,它提供了使用javascript与网页交互的方式。想了解更多的相关内容,可以阅读本专题下面的文章。

4346

2024.08.14

promise的用法
promise的用法

“promise” 是一种用于处理异步操作的编程概念,它可以用来表示一个异步操作的最终结果。Promise 对象有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。Promise的用法主要包括构造函数、实例方法(then、catch、finally)和状态转换。

337

2023.10.12

html文本框类型介绍
html文本框类型介绍

html文本框类型有单行文本框、密码文本框、数字文本框、日期文本框、时间文本框、文件上传文本框、多行文本框等等。详细介绍:1、单行文本框是最常见的文本框类型,用于接受单行文本输入,用户可以在文本框中输入任意文本,例如用户名、密码、电子邮件地址等;2、密码文本框用于接受密码输入,用户在输入密码时,文本框中的内容会被隐藏,以保护用户的隐私;3、数字文本框等等。

429

2023.10.12

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 10.6万人学习

Excel 教程
Excel 教程

共162课时 | 21.3万人学习

PHP基础入门课程
PHP基础入门课程

共33课时 | 2.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号