你必须了解的 React 18 新特性

了解 react 18 的新特性对于开发人员来说至关重要,因为这些更新可能会显著改变库的功能和使用方式。使用最新版本的库可以确保获得最佳性能和最新的功能。

本文将探讨 React 18 的定义、React 17 的问题、React 18 引入的新特性以及为什么你应该升级到最新版本。

React 18 是什么?

在讨论 React 18 的新功能之前,让我们先了解什么是 React 18。任何 18.0.0 以上但不包括 19.0.0 的 React 库的稳定版本都被称为 React 18。

React 18 引入了并发渲染,这是一个重要的新特性。React 一直专注于 DOM 渲染,并为开发人员提供了控制和跟踪组件生命周期的工具。有了这些新功能,React 18 现在能够根据客户端设备的性能调整渲染过程。

升级到 React 18

React 社区提供了多种安装选项。要在应用程序中安装 React 18,可以在 HTML 脚本标记中使用 CDN URL 作为源(

src

)。

通过在工作目录的终端中执行以下命令,你可以使用 NPM 或 Yarn 升级或安装 React 18,用于单页面和绑定应用程序。NPM:

npm install react react-dom

Yarn:

yarn add react react-dom

上面的命令将自动检测并安装或升级开发环境中最新的 React 和 React DOM 版本。

React 17 的问题

React 社区已经注意到库中存在一些需要改进的问题。如果 React 17 功能完美,就不需要发布 React 18 和更高版本了。

根据 React 18.0.0 的更新日志,React 17 或更早版本的以下问题得到了解决:

如果返回

undefined

,Render 将抛出一个错误:当组件返回

undefined

值时,应用程序将中断。

应用程序显示以下错误:

你必须了解的 React 18 新特性image.png

你还会注意到控制台中的以下错误:

你必须了解的 React 18 新特性image.png

卸载组件的

setState

给出一个警告:在试图更新卸载组件的状态时,React 可能会警告你内存泄漏。

你必须了解的 React 18 新特性image.png

严格模式控制台日志消除:从社区反馈中,我们注意到在使用严格模式时,控制台日志消息的消除会造成混乱,因为只显示一个而不是两个。内存消耗:React 17 和更早的版本存在内存泄漏问题,特别是在未挂载的组件中。

React 18 发生了什么变化?

React 18 更加强调应用程序的并发性。这个概念包括「自动批处理」和「过渡」等功能,以及

createRoot

hydrateRoot

renderToPipeableStream

renderToReadableStream

等 API。它还包括

useId

useTransition

useDeferredValue

useSyncExternalStore

useInsertionEffect

等 hooks,以及 Strict Mode 的更新和

ReactDOM.render

renderToString

的弃用。

让我们更深入地看看这些变化?

4.1 Client Rendering

在升级后,你可能需要留意下面列出的控制台警告:

你必须了解的 React 18 新特性image.png

如果你继续使用 React 17 中支持的

ReactDOM.render()

API,你将看到这个警告。通常,我们导入一个组件,并使用

id="app"

div

元素中渲染它。

import ReactDOM from 'react-dom';import App from 'App';const app = document.getElementById('app');ReactDOM.render(, app);

在 React 18 中,就像下面的代码样例一样,我们使用了从

"react-dom/client"

导入的

createRoot()

API:

import { createRoot } from 'react-dom/client';import App from 'App';const app = document.getElementById('app');// 创建根节点const root = createRoot(app);// 将 App 渲染到 rootroot.render();

4.2 Hydration

React 17 使用了

ReactDOM.hydrate()

API 来渲染

hydration

,如下面的代码样例所示:

Laravel 5.4 一键安装包 Laravel 5.4 一键安装包

Laravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁、富于表达力。Laravel 5.4 带来了很多新特性以及对原有功能的提升。

Laravel 5.4 一键安装包 2320 查看详情 Laravel 5.4 一键安装包

import * as ReactDOM from 'react-dom';import App from 'App';const app = document.getElementById('app');ReactDOM.hydrate(, app);

在 React 18 中,

hydration

使用了从

"react-dom/client"

导入的

hydrateRoot()

API,不需要像上面代码片段中那样单独的

render()

方法:

import { hydrateRoot } from 'react-dom/client';import App from 'App';const app = document.getElementById('app');const root = hydrateRoot(app, );

4.3 Render Callback

你可以在呈现根组件时传递回调函数,以便它在组件呈现或更新后执行。

在 React 17 的渲染方法中,你可以传递一个回调函数作为第三个参数,如下面的代码片段所示:

import * as ReactDOM from 'react-dom';import App from 'App';const app = document.getElementById('app');ReactDOM.render(, app, function() {  // 在初始渲染或任何更新后调用。  console.log('Rendered or Updated');});

回调函数在 React 18 中是不允许的,因为它会通过逐步或部分的

hydration

影响应用程序的运行时。相反,你可以在根元素上使用

ref
callback

setTimeout

requestIdleCallback

,如下面的代码示例所示:

import { createRoot } from 'react-dom/client';function App({ callback }) {  // 第一次创建 div 时将调用 callback  return (    

Hello World

);}const app = document.getElementById("root");const root = createRoot(app);root.render( console.log("Rendered or Updated")} />);

4.4 自动批处理

在版本 17 之前,状态更新只在 React 事件处理程序中进行批处理。因此,在事件处理程序之外进行的任何状态更新都会导致 re-render,这需要 React 执行额外的后台任务。例如:

const handleClick = () => {  setFirstState("1");  setSecondState("2");}

只有在事件回调函数结束时所有的状态都被更改之后,然后触发一个单独的 re-render,合并所有更新。

promise

、原生事件或外部 React 事件处理程序中的状态更新由于丢失了上下文,无法做合并处理,所以每次

setState

调用都会触发一次 re-render。例如:

fetch('https://api.com').then(() => {  setFirstState("1");  setSecondState("2");})// orsetTimeout(() => {  setFirstState("1");  setSecondState("2");})

在上面的代码片段中,React 将为每次状态更新 re-render。

React 18 中的

createRoot()

API 支持批处理所有状态更新,而不管它们发生在应用程序的什么位置。React 在所有状态更新后 re-render 页面。

由于这是一个重大的更改,你可以使用

flushSync()

API 停止自动批处理。

import { flushSync } from 'react-dom';function handleClick() {  flushSync(() => {    setFirstState("1");  });  flushSync(() => {    setSecondState("2");  });}

在上面的代码片段中,

flushSync()

的每个实例都更新状态并允许 React re-render。

4.5 Transition

你可以使用 Transition 来区分需要立即更新状态的资源和不需要立即更新状态的资源。

搜索栏的功能就是一个很好的例子。当用户输入搜索词时,你可能希望显示视觉反馈。但是,你不希望在用户完成输入之前就开始搜索。

import { startTransition } from 'react';// 立即显示当前键入的内容setSearchCurrentValue(input);startTransition(() => {  // 不立即显示最后输入的内容  setSearchFinalValue(input);});

在代码片段中,我们没有使用将延迟状态更新的

setTimeout()

,而是使用

startTransition()

来监视状态更新。

setSearchCurrentValue()

只更新与我们希望用户立即获得的反馈相关的状态,

setSearchFinalValue()

更新我们希望在用户完成输入后最终进行搜索时使用的状态。

setTimeout

不同的是,

startTransition

更新可以中断,可以跟踪挂起的更新,并且它会立即执行。意味着他们可以被其他紧急渲染所抢占。这种渲染优先级的调整手段可以帮助我们解决各种性能伪瓶颈,提升用户体验。

4.6 放弃对 Internet Explorer 的支持

React 社区也放弃了对 Internet Explorer 的支持,这意味着只有 React 18 之前的版本才能在 Internet Explorer 上运行。现代浏览器功能如

multitask

promise

Object.assign

Symbol

在 Internet Explorer 中不会被 polyfill。

React 18 相对于 React 17 的优点

即使在了解了 React 17 和 React 18 之间的区别之后,你可能仍然不确定是切换到 React 18 还是坚持使用 React 17。

如果一个新版本不能提供比之前版本更多的好处,它就不会受到欢迎。

并发性是 React 18 的主要优势之一。这是一个全新的概念,而不是一个功能,使 React 应用程序运行在 React 18 及更高版本上,优化它们在客户端设备上的性能。

通过在卸载时清除后台任务,React 18 增强了内存管理,降低了内存泄漏的危险。

小结

在阅读本文后,你应该能够更新 React 版本并重构代码库以无缝地使用 React 18。为了获得最新的更改和新版本的信息,你还应该密切关注 React 库的更新日志,并与 React 社区保持联系。

以上就是你必须了解的 React 18 新特性的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
云闪付交罚款怎么操作_云闪付缴纳罚款流程
上一篇 2025年11月26日 13:16:03
后盾网MySQL数据库视频教程资源推荐
下一篇 2025年11月26日 13:16:07

相关推荐

  • composer require-dev和require有什么不同_Composer Require与Require-Dev区别解析

    require用于声明项目运行必需的依赖,如框架、数据库组件和第三方SDK,这些包会随项目部署到生产环境;2. require-dev用于声明仅在开发和测试阶段需要的工具,如PHPUnit、PHPStan、Faker等,不会默认部署到生产环境;3. 安装时composer install根据环境决定…

    2026年5月10日
    1000
  • 修复Django电商项目中AJAX过滤产品列表图片不显示问题

    在Django电商项目中,当使用AJAX动态加载过滤后的产品列表时,常遇到图片无法正常显示的问题。这通常是由于前端模板中图片加载方式(如data-setbg属性结合JavaScript库)与AJAX动态内容更新机制不兼容所致。解决方案是直接在AJAX返回的HTML中使用标准的标签来渲染图片,确保浏览…

    2026年5月10日
    000
  • Matplotlib 地图中多类型图例的创建与优化

    Matplotlib 地图中多类型图例的创建与优化Matplotlib 地图中多类型图例的创建与优化Matplotlib 地图中多类型图例的创建与优化Matplotlib 地图中多类型图例的创建与优化

    本教程旨在解决matplotlib地图可视化中,如何在一个图例中同时展示颜色块(如区域分类)和自定义标记(如特定兴趣点)的问题。文章详细介绍了当传统`patch`对象无法正确显示标记时,如何利用`matplotlib.lines.line2d`创建标记图例句柄,并将其与颜色块图例句柄合并,从而生成一…

    2026年5月10日 用户投稿
    100
  • Golang JSON序列化:控制敏感字段暴露的最佳实践

    本教程探讨golang中如何高效控制结构体字段在json序列化时的可见性。当需要将包含敏感信息的结构体数组转换为json响应时,通过利用`encoding/json`包提供的结构体标签,特别是`json:”-“`,可以轻松实现对特定字段的忽略,从而避免敏感数据泄露,确保api…

    2026年5月10日
    000
  • 利用海象运算符简化条件赋值:Python教程与最佳实践

    本文旨在探讨Python中海象运算符(:=)在条件赋值场景下的应用。通过对比传统if/else语句与海象运算符,以及条件表达式,分析海象运算符在简化代码、提高可读性方面的优势与局限性。并通过具体示例,展示如何在列表推导式等场景下合理使用海象运算符,同时强调其潜在的复杂性及替代方案,帮助开发者更好地掌…

    2026年5月10日
    100
  • Debian syslog性能优化技巧有哪些

    提升Debian系统syslog (通常基于rsyslog)性能,关键在于精简配置和高效处理日志。以下策略能有效优化日志管理,提升系统整体性能: 精简配置,高效加载: 在rsyslog配置文件中,仅加载必要的输入、输出和解析模块。 使用全局指令设置日志级别和格式,避免不必要的处理。 自定义模板: 创…

    2026年5月10日
    000
  • 怎么在PHP代码中实现图片上传功能_PHP图片上传功能实现与安全处理教程

    首先创建含enctype的HTML表单,再用PHP接收文件,检查目录、移动临时文件,验证类型与大小,生成唯一文件名,并调整php.ini限制以确保上传成功。 如果您尝试在PHP项目中添加图片上传功能,但服务器无法正确接收或保存文件,则可能是由于表单配置、文件处理逻辑或安全限制的问题。以下是实现该功能…

    2026年5月10日
    100
  • 比特币新手教程 比特币交易平台有哪些

    比特币是一种去中心化的数字货币,基于区块链技术实现点对点交易,具有匿名性、有限发行和不可篡改等特点;新手可通过交易所购买,P2P交易获得比特币,常用平台包括Binance、OKX和Huobi;交易流程包括注册账户、实名认证、绑定支付方式、充值法币并下单购买,可选择市价单或限价单;比特币存储方式有交易…

    2026年5月10日
    000
  • c++中的SFINAE技术是什么_c++模板编程中的SFINAE原理与应用

    SFINAE 是“替换失败不是错误”的原则,指模板实例化时若参数替换导致错误,只要存在其他合法候选,编译器不报错而是继续重载决议。它用于条件启用模板、类型检测等场景,如通过 decltype 或 enable_if 控制函数重载,实现类型特征判断。尽管 C++20 引入 Concepts 简化了部分…

    2026年5月10日
    000
  • HTML如何隐藏滚动条或去除滚动条

    滚动条可以存在也可以不存在,本文主要介绍了html 隐藏滚动条和去除滚动条的方法的相关资料,大家一起来学习一下html隐藏滚动条或去除滚动条的方法吧。 1. html 标签加属性 XML/HTML Code复制内容到剪贴板 2.body中加入以下代码 立即学习“前端免费学习笔记(深入)”; html…

    用户投稿 2026年5月10日
    000
  • vscode上怎么运行html_vscode上运行html步骤【指南】

    首先保存文件为.html格式,再通过浏览器或Live Server插件打开预览;推荐安装Live Server实现本地服务器运行与实时刷新,提升开发体验。 在 VS Code 上运行 HTML 文件并不需要复杂的配置,只需几个简单步骤即可预览页面效果。VS Code 本身是一个代码编辑器,不直接运行…

    2026年5月10日
    100
  • RichHandler与Rich Progress集成:解决显示冲突的教程

    在使用rich库的`richhandler`进行日志输出并同时使用`progress`组件时,可能会遇到显示错乱或溢出问题。这通常是由于为`richhandler`和`progress`分别创建了独立的`console`实例导致的。解决方案是确保日志处理器和进度条组件共享同一个`console`实例…

    2026年5月10日
    000
  • 修复点击时按钮抖动:CSS垂直对齐实践

    本文探讨了在Web开发中,交互式按钮(如播放/暂停按钮)在点击时发生意外垂直位移的问题。通过分析CSS样式变化对元素布局的影响,我们发现这是由于按钮不同状态下的边框样式和内边距改变,以及默认的垂直对齐行为共同作用所致。核心解决方案是利用CSS的vertical-align属性,将其设置为middle…

    2026年5月10日
    000
  • 理解编程指令:当结果正确,但实现方式不符要求时

    本文探讨了在编程实践中,即使程序输出了正确的结果,但若其实现方式未能严格遵循既定指令,仍可能被视为“不正确”的问题。我们将通过具体示例,对比直接求和与累加求和两种实现策略,强调理解和遵守编程规范的重要性,以确保代码的健壮性、可维护性及符合项目要求。 在软件开发过程中,我们经常会遇到这样的情况:编写的…

    2026年5月10日
    000
  • Golang goroutine与channel调试技巧

    使用go run -race检测数据竞争,结合runtime.NumGoroutine监控协程数量,通过pprof分析阻塞调用栈,利用select超时避免永久阻塞,有效排查goroutine泄漏、死锁和数据竞争问题。 Go语言的goroutine和channel是并发编程的核心,但它们也带来了调试上…

    2026年5月10日
    000
  • 页面中文本域的值怎么设置

    标签定义多行的文本输入控件。 文本区中可容纳无限数量的文本,其中的文本的默认字体是等宽字体(通常是 Courier)。 可以通过 cols 和 rows 属性来规定 textarea 的尺寸,不过更好的办法是使用 CSS 的 height 和 width 属性。 注释:在文本输入区内的文本行间,用 …

    2026年5月10日
    000
  • 使用 Jupyter Notebook 进行探索性数据分析

    Jupyter Notebook通过单元格实现代码与Markdown结合,支持数据导入(pandas)、清洗(fillna)、探索(matplotlib/seaborn可视化)、统计分析(describe/corr)和特征工程,便于记录与分享分析过程。 Jupyter Notebook 是进行探索性…

    2026年5月10日
    000
  • php常量怎么用_PHP常量(define/const)定义与使用方法

    PHP中可通过define函数和const关键字定义常量,用于存储不可变值。define适用于全局作用域,支持动态名称和条件定义,如define(‘SITE_NAME’, ‘MyWebsite’);const在编译时生效,语法简洁但限制多,只能在类或全…

    2026年5月10日
    000
  • 如何在HTML中插入表单元素_HTML表单控件与输入类型使用指南

    HTML表单通过标签构建,包含action和method属性定义数据提交目标与方式,常用input类型如text、password、email等适配不同输入需求,配合label、required、placeholder提升可用性,结合textarea、select、button等控件实现完整交互,是…

    2026年5月10日
    000
  • 前端缓存策略与JavaScript存储管理

    根据数据特性选择合适的存储方式并制定清晰的读写与清理逻辑,能显著提升前端性能;合理运用Cookie、localStorage、sessionStorage、IndexedDB及Cache API,结合缓存策略与定期清理机制,可在保证用户体验的同时避免安全与性能隐患。 前端缓存和JavaScript存…

    2026年5月10日
    100

发表回复

登录后才能评论
关注微信