来来来,尝试一下 React 18 !

来来来,尝试一下 React 18 !

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

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

来来来,尝试一下 React 18 !

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

来来来,尝试一下 React 18 !

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

安装 React 18 Alpha

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

代码语言:javascript代码运行次数:0运行复制

npm install react@alpha react-dom@alpha# oryarn add react@alpha react-dom@alpha

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

代码语言:javascript代码运行次数:0运行复制

Could not resolve dependency:peer react@">= 16" from react-scripts@4.0.3

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

代码语言:javascript代码运行次数:0运行复制

npm install react@alpha react-dom@alpha --force

ReactDOM.createRoot()

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

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

代码语言:javascript代码运行次数:0运行复制

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();

渲染的自动批处理

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

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

代码语言:javascript代码运行次数:0运行复制

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;  }};

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

假设 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运行复制

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}

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运行复制

const MonacoEditor = React.lazy(() => import('react-monaco-editor'));

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

代码语言:javascript代码运行次数:0运行复制

const OtherComponent = React.lazy(() => import('./OtherComponent'));function MyComponent() {  return (    // Displays  until OtherComponent loads    <React.Suspense fallback={}>      
);}

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

代码语言:javascript代码运行次数:0运行复制

   
<Suspense fallback={}>

比如上面的代码,

组件首先会被渲染, 组件将被 fallback 替换为 。一旦 组件加载完成后,React 会才将其发送到浏览器,替换 组件。

来来来,尝试一下 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运行复制

setInputValue (input) ; setSearchQuery (input) ;

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

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

来来来,尝试一下 React 18 !

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

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

代码语言:javascript代码运行次数:0运行复制

import { startTransition } from 'react';// Urgent: Show what was typedsetInputValue(input);// Mark any state updates inside as transitionsstartTransition(() => {  // Transition: Show the results  setSearchQuery(input);});

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

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

代码语言:javascript代码运行次数:0运行复制

import  {  useTransition  }  from  'react' ; const  [ isPending ,  startTransition ]  =  useTransition ( ) ;

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

代码语言:javascript代码运行次数:0运行复制

{ isPending  &&   }

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 还没 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

以上就是来来来,尝试一下 React 18 !的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/49756.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月8日 13:46:24
下一篇 2025年11月8日 13:50:53

相关推荐

  • php开发都用到哪些

    PHP 开发中使用了多种工具和技术,包括:Web 服务器,如 Apache HTTP 服务器、Nginx 和 IIS数据库,如 MySQL、PostgreSQL 和 MongoDB框架,如 Laravel、Symfony 和 CodeIgniterORM,如 Doctrine Eloquent 和 …

    2025年12月12日
    000
  • 哪些软件适合写php

    对于 PHP 开发,推荐使用的软件包括:集成开发环境 (IDE):PHPStorm、VSCode代码编辑器:Notepad++、Atom、Vim插件和工具:Composer、XDebug、PHPUnit 适用于 PHP 开发的软件 PHP (超文本预处理语言) 是一种广受欢迎的服务器端脚本语言,用于…

    2025年12月12日
    000
  • php需要学哪些技术

    PHP 所需的技术 要成为一名熟练的 PHP 开发人员,需要掌握以下技术: 1. 核心 PHP PHP 语法和语义数据类型和变量控制流结构函数和类 2. Web 开发 立即学习“PHP免费学习笔记(深入)”; HTML 和 CSSJavaScript 和 jQueryWeb 服务(RESTful A…

    2025年12月12日
    000
  • 想学php需要哪些基础

    学习 PHP 需要具备以下基础: HTML 和 CSS、编程基础、数据库基础、版本控制、操作系统、对 Web 开发的兴趣以及解决问题的技能。 想学 PHP 需要哪些基础? 要学习 PHP,需要具备以下基础: 1. HTML 和 CSS 了解 HTML 结构和语义掌握 CSS 元素样式和布局 2. 编…

    2025年12月12日
    000
  • php开发需要学哪些

    PHP 开发必备知识和技能:掌握 PHP 语法、OOP 概念、数据库管理系统 (DBMS)、SQL 查询语言熟悉 PHP Web 开发框架 (Laravel、Symfony 等)、前端技术 (HTML、CSS、JavaScript)掌握版本控制系统 (Git、SVN)、Composer、Xdebug…

    2025年12月12日
    000
  • php工作需要哪些

    PHP 工作所需技能:PHP 核心:扎实的语法和语义基础,包括面向对象编程 (OOP) 原则。框架和 CMS:熟练使用流行的 PHP 框架,了解 WordPress 等内容管理系统 (CMS) 的原理。数据库:精通 MySQL 等数据库,能够编写 SQL 查询和执行数据库操作。前端技术:掌握 HTM…

    2025年12月12日
    000
  • php安装需要哪些软件

    PHP 安装需要 Web 服务器、PHP 解释器、数据库服务器(如 MySQL)、Composer 和 Git 等附加软件。可选软件包括 IDE、Xdebug 和 Opcache,可提供更高级的功能。安装步骤包括安装 Web 服务器、PHP 解释器、配置 Web 服务器、安装附加软件和安装可选软件。…

    2025年12月12日
    000
  • php要会哪些东西

    精通 PHP 需掌握以下内容:基本语法和结构变量类型和操作符控制流结构函数和数组面向对象编程(类、对象、继承、多态、封装)接口和抽象类数据库操作(MySQL 等)数据查询和修改(CRUD)数据建模和优化Web 开发(HTTP、RESTful API) 想要精通 PHP,需要掌握哪些内容? 基本语法和…

    2025年12月12日
    000
  • 如何开发php大型网站

    如何开发 PHP 大型网站:定义要求:明确受众、功能、流量和并发性。选择架构:分层、微服务或 RESTful。选择技术栈:框架、库和优化工具。设计数据库:优化架构、表设计和查询。编写业务逻辑:遵循设计模式和单元测试。创建视图:使用模板引擎和响应式设计。优化性能:缓存、CDN 和内容优化。部署和维护:…

    2025年12月12日
    000
  • Windowlight 八月更新中令人兴奋的新功能!

    Windowlight 八月更新:提升您的代码截图体验 我很高兴宣布 windowlight 八月更新!此版本带来了许多新功能和改进,进一步增强了您的代码屏幕截图生成体验。 什么是窗灯? Windowlight 是一个基于 Laravel 的代码屏幕截图生成器,它使用 Torchlight 实现令人…

    2025年12月12日
    000
  • php如何压缩

    PHP 代码压缩方法:使用内置函数 gzcompress() 和 gzdeflate() 进行压缩并使用 base64 编码。使用 Phar 扩展的 Phar::compress() 函数将文件压缩成 Phar 存档。使用第三方库,如 php-compressor、compress 和 zipstr…

    2025年12月12日
    000
  • 如何把网站转化支持php

    将网站转化为支持 PHP,需要以下步骤:选择合适的 PHP 版本。安装 PHP。配置 Web 服务器。创建 PHP 文件。编写 PHP 代码。测试网站。部署网站。维护网站。 如何将网站转化为支持 PHP 步骤 1:选择合适的 PHP 版本 根据网站的需要,选择合适的 PHP 版本。最新版本通常提供更…

    2025年12月12日
    000
  • php状态码有哪些

    PHP 状态码指示响应状态,包含三个数字:响应类型(百位数位)、响应子类型(十位数位)、可选子状态代码(个位数位)。常见状态码包括:1xx 信息响应(例如:100 Continue)2xx 成功响应(例如:200 OK)3xx 重定向响应(例如:301 Moved Permanently)4xx 客…

    2025年12月12日
    000
  • php面试问哪些东西

    PHP 面试考察的内容包括:PHP 语法、数据类型、变量、数组、对象、类控制流、函数、文件处理、数据库交互OOP:类、对象、继承、多态性MVC 架构、框架(Laravel、CodeIgniter)、ORM、SQL版本控制(Git)、部署工具(Docker)性能优化、代码优化、异常处理、安全实践问题解…

    2025年12月12日
    000
  • 哪些网站是php开发

    PHP(超文本预处理器)是一种流行的服务器端脚本语言,广泛用于网站开发,包括官方网站、框架和 CMS(如 Laravel、WordPress、Drupal、Joomla、Magento)、代码库和包管理器(如 GitHub、Packagist)、社区和支持(如 Stack Overflow、PHPB…

    2025年12月12日
    000
  • php需要学哪些技能

    成为熟练的 PHP 开发人员,需要掌握以下关键技能:核心 PHP 概念和面向对象编程数据库连接和查询Web 开发基础(HTML、CSS、JavaScript)HTTP 和服务器端编程框架和工具(PHP 框架、Composer、Xdebug 调试器、IDE)数据库管理(SQL、数据库设计)持续集成和部…

    2025年12月12日
    000
  • php实习需要哪些技能

    PHP 实习所需技能为:1. 核心 PHP 能力:扎实的 PHP 基础、OOP 原则、数据结构处理;2. Web 开发知识:熟悉 HTML、CSS、JavaScript、PHP 框架、数据库使用;3. 软件工程实践:遵守代码规范、使用版本控制系统、团队协作;4. 其他技能:问题解决能力、学习热情、沟…

    2025年12月12日
    000
  • php开发经验有哪些

    PHP 开发经验包括:使用 Web 框架构建网站开发后端系统,包括 API、CMS 和电子商务解决方案自动化业务流程和任务构建移动应用程序的后端和 API数据分析和报表生成涉及数据库、版本控制和容器化技术理解 Web 安全最佳实践 PHP 开发经验 PHP 作为一种广泛使用的服务器端脚本语言,在众多…

    2025年12月12日
    000
  • php源码网站有哪些

    问题:列举 PHP 源码网站?回答:PackagistGitHubCodeCanyonLaracastsSmashing MagazinePHPClasses.orgThe PHP ArchiveZend Frameworksymfony.comCakePHP PHP 源码网站 有哪些 PHP 源码…

    2025年12月12日
    000
  • php要学哪些软件

    要学习 PHP,需要以下软件:文本编辑器(如 Notepad++)PHP 解释器(从 PHP 官网下载)Web 服务器(如 Apache)数据库管理系统(如 MySQL,可选)开发环境(IDE)(如 PHPStorm,可选)版本控制系统(如 Git,可选) 学习PHP所需的软件 要学习PHP,需要以…

    2025年12月12日
    000

发表回复

登录后才能评论
关注微信