React 19新特性和更新介绍 03 - 改进和增强

news/2025/2/21 10:18:04/文章来源:https://www.cnblogs.com/eddyz/p/18724608

React 19新特性和更新介绍 03 - 改进和增强

React 19 于 2024 年 4 月 25 日正式发布,标志着一个重要的里程碑。

此版本带来了各种新功能和改进,以增强开发人员体验和应用程序性能。

React 19 中的改进和增强

1. Ref 作为 Prop

React 19 对 refs 进行了重大改进:
现在您可以将其作为 props 传递给功能组件(functional components)。这在大多数情况下消除了对 forwardRef 高阶组件 (HOC) 的需求。
新的函数组件(function components)将不再需要 forwardRef,我们将发布 codemod 来自动更新您的组件以使用新的 ref prop。
在未来的版本中,我们将弃用并删除 forwardRef。

关键改进

  • 使用 Refs 的更简单的功能组件:以前,功能组件无法直接将 refs 作为 props 接收。使用 React 19,您可以使用标准 prop 语法传递 refs,使功能组件在与 DOM 元素交互时更加灵活。
  • 减少样板:通过消除对 forwardRef 的需求,您的代码变得更干净、更简洁。这简化了组件创建并提高了可读性。
  • 向后兼容性:对于需要将 ref 传递给类组件或深度嵌套的功能组件层次结构的场景,React 19 仍然支持 forwardRef HOC。使用 forwardRef 的现有代码将继续按预期运行。

示例:


<MyInput ref={ref} />

function MyInput({placeholder, ref}) {return <input placeholder={placeholder} ref={ref} />
}

2. Hydration Error 的差异

我们通过改进错误报告的方式,使发现 React 中的错误变得更加容易。之前,它只会显示一堆错误,而不会解释出了什么问题。现在,它会显示一条清晰的消息,详细说明不同之处。

3. Context as a Provider

在 React 19 中,你可以将 <Context> 渲染为 Provider ,而不是 <Context.Provider>

示例:

const ThemeContext = createContext('');function App({ children }) {return (<ThemeContext value="dark">{children}</ThemeContext>);
}

4. Refs 的清理函数

React 19 为 refs 引入了一项新功能:能够从 ref 回调中返回清理函数。
这允许在组件卸载时更好地管理资源。

主要改进

  • 自动清理:当组件卸载时,React 将自动调用从 ref 回调返回的清理函数。这可确保正确清理与 ref 相关的资源,例如删除事件侦听器、关闭订阅或释放内存。
  • 提高代码可读性:通过在 ref 回调中明确定义清理逻辑,您的代码变得更易读和更易于维护。您可以在创建 ref 的同时跟踪资源管理。
  • 减少内存泄漏:通过确保正确清理,您可以防止 React 应用程序中的内存泄漏。这对于长时间运行的组件或处理外部资源的组件尤其重要。

示例:

<inputref={(ref) => {// ref created// NEW: return a cleanup function to reset// the ref when element is removed from DOM.return () => {// ref cleanup};}}
/>

5. 支持文档元数据 ( Document Metadata )

React 19 通过一项新功能简化了文档元数据(标题、描述、元标记)的管理:内置对文档元数据的支持。此改进简化了 SEO(搜索引擎优化)并增强了对文档 部分的控制。

主要改进

  • 专用组件:React 19 引入了 DocumentHead 组件。这允许您在 React 组件中声明性地定义元数据元素。与传统方法相比,这种方法改善了代码组织和可读性。
  • 简化的 SEO 管理:通过在 DocumentHead 中集中元数据管理,您可以轻松地直接在 React 应用程序中控制标题、描述和其他与 SEO 相关的元素。这使 SEO 管理更加高效。
  • 减少样板:使用 DocumentHead 无需手动操作字符串或复杂的解决方法来更新文档元数据。这可以使代码更干净、更简洁。

在 HTML 中,文档元数据标签(如 、<link> 和 <meta>)保留用于放置在文档的 <head> 部分中。在 React 中,决定哪些元数据适合应用的组件可能距离渲染 <head> 的位置非常远,或者 React 根本不渲染 <head>。过去,这些元素需要手动插入到效果中,或者通过 react-helmet 等库插入,并且在服务器渲染 React 应用程序时需要小心处理。</p> <p>在 React 19 中,我们添加了对在组件中原生渲染文档元数据标签的支持:</p> <p>当 React 渲染此组件时,它将看到 <title>、<link> 和 <meta> 标签,并自动将它们提升到文档的 <head> 部分。通过原生支持这些元数据标签,我们能够确保它们适用于仅限客户端的应用程序、流式 SSR 和服务器组件。</p> <pre><code class="language-jsx"> function BlogPost({post}) {return (<article><h1>{post.title}</h1><title>{post.title}</title><meta name="author" content="Josh" /><link rel="author" href="https://twitter.com/joshcstory/" /><meta name="keywords" content={post.keywords} /><p>Eee equals em-see-squared...</p></article>); }</code></pre> <h2 id="6-样式表支持">6. 样式表支持</h2> <p>React 19 为管理 React 组件中的样式表引入了重大改进:内置样式表支持,包括外部链接样式表和内联样式。此增强功能简化了样式的应用方式,并确保在不同场景中正确呈现。</p> <p>主要改进</p> <p>改进的样式表管理:React 19 控制 DOM 中的样式表加载和插入顺序。这消除了在呈现组件之前应用样式的潜在问题。<br> 声明性控制:您可以直接在组件中指定样式表依赖项,从而更轻松地管理特定于特定组件或组件组的样式。<br> 减少样板:React 处理样式表管理的复杂性,减少了对手动解决方法或复杂样式库的需求。</p> <p>由于样式优先规则,样式表(包括外部链接 (<link rel="stylesheet" href="...">) 和内联 (<style>...</style>))都需要在 DOM 中仔细定位。构建允许在组件内组合的样式表功能非常困难,因此用户通常要么将所有样式加载到可能依赖它们的组件之外,要么使用封装了这种复杂性的样式库。</p> <p>在 React 19 中,我们解决了这种复杂性,并通过内置对样式表的支持,提供与客户端并发渲染和服务器流式渲染的更深入集成。如果您告诉 React 样式表的优先级,它将管理样式表在 DOM 中的插入顺序,并确保在显示依赖于这些样式规则的内容之前加载样式表(如果是外部的)。</p> <p>在服务器端渲染期间,React 会将样式表包含在 <head> 中,这可确保浏览器在加载之前不会进行绘制。如果在我们开始流式传输之后才发现样式表,React 将确保在显示依赖于该样式表的 Suspense 边界的内容之前,将样式表插入到客户端的 <head> 中。</p> <p>示例:</p> <pre><code> function ComponentOne() {return (<Suspense fallback="loading..."><link rel="stylesheet" href="foo" precedence="default" /><link rel="stylesheet" href="bar" precedence="high" /><article class="foo-class bar-class">{...}</article></Suspense>) }function ComponentTwo() {return (<div><p>{...}</p><-- 通过 precedence 属性,will be inserted between foo & bar --><link rel="stylesheet" href="baz" precedence="default" /> </div>) }</code></pre> <h2 id="7-支持异步脚本">7. 支持异步脚本</h2> <p>React 19 为处理组件中的异步脚本带来了令人欣喜的改进:更好地支持异步脚本。这简化了管理组件树中异步加载且可能以任何顺序加载的脚本。</p> <p>主要改进</p> <ul> <li>灵活的脚本放置:异步脚本现在可以放置在组件树中的任何位置,而无需担心重复或重新定位。React 确保每个脚本只加载和执行一次,即使多个组件渲染它也是如此。</li> <li>减少样板:您不再需要实现复杂的逻辑来管理脚本加载顺序或重复数据删除。React 会自动处理这些方面,从而简化您的代码。</li> <li>提高代码可读性:通过将异步脚本放置在依赖它们的组件附近,您的代码变得更加直观且更易于维护</li> </ul> <p>在 HTML 中,普通脚本 (<script src="...">) 和延迟脚本 (<script defer="" src="...">) 按文档顺序加载,这使得在组件树深处渲染这些类型的脚本变得具有挑战性。然而,异步脚本 (<script async="" src="...">) 将按任意顺序加载。</p> <p>在 React 19 中,我们提供了对异步脚本的更好支持,允许您在组件树中的任何位置(实际依赖脚本的组件内)渲染它们,而无需管理重新定位和重复数据删除脚本实例。</p> <p>在所有渲染环境中,异步脚本将被去重,这样即使由多个不同的组件渲染,React 也只会加载并执行一次脚本。</p> <p>在服务器端渲染中,异步脚本将包含在 <head> 中,并在绘制的更重要的资源之后再加载(例如样式表、字体和图像预加载)。</p> <p>有关更多详细信息,请阅读 <script> 的文档。</p> <pre><code class="language-jsx"> function MyComponent() {return (<div><script async={true} src="..." />Hello World</div>) }function App() {<html><body><MyComponent>...<MyComponent> // won't lead to duplicate script in the DOM</body></html> }</code></pre> <h2 id="8-支持预加载资源">8. 支持预加载资源</h2> <p>React 19 引入了一项重大的性能优化改进:内置支持预加载字体、脚本和样式表等资源。这允许您在用户与初始页面内容交互时主动在后台获取这些资源。</p> <p>关键改进</p> <ul> <li>更快的页面加载:通过预加载资源,浏览器可以在渲染迫切需要它们之前获取它们,从而带来更流畅的用户体验和更快的感知加载时间。</li> <li>改进的用户体验:预加载资源减少了初始页面加载后需要下载的内容量,从而为用户带来更无缝的体验,尤其是在连接速度较慢的情况下。</li> <li>声明性控制:您可以通过 React 19 使用新的浏览器 API,如预加载、预取和预连接,从而在组件内提供对资源预加载的声明性控制。</li> </ul> <p>在初始文档加载和客户端更新期间,尽早告知浏览器可能需要加载的资源会对页面性能产生巨大影响。</p> <p>React 19 包含许多用于加载和预加载浏览器资源的新 API,以便尽可能轻松地构建出色的体验,而不会因资源加载效率低下而受到阻碍。</p> <pre><code class="language-jsx"> import { prefetchDNS, preconnect, preload, preinit } from 'react-dom'function MyComponent() {preinit('https://.../path/to/some/script.js', {as: 'script' }) // loads and executes this script eagerlypreload('https://.../path/to/font.woff', { as: 'font' }) // preloads this fontpreload('https://.../path/to/stylesheet.css', { as: 'style' }) // preloads this stylesheetprefetchDNS('https://...') // when you may not actually request anything from this hostpreconnect('https://...') // when you will request something but aren't sure what }</code></pre> <p>上述代码将生成以下 DOM/HTML:</p> <pre><code class="language-html"> <html><head><!-- links/scripts 的优先级取决于它们在早期加载时的实用性,而不是调用顺序 --><link rel="prefetch-dns" href="https://..."><link rel="preconnect" href="https://..."><link rel="preload" as="font" href="https://.../path/to/font.woff"><link rel="preload" as="style" href="https://.../path/to/stylesheet.css"><script async="" src="https://.../path/to/some/script.js"></script></head><body>...</body> </html></code></pre> <p>这些 API 可用于优化初始页面加载,方法是将字体等其他资源的发现移出样式表加载。<br> 它们还可以通过预取预期导航使用的资源列表,然后在点击或悬停时热切地预加载这些资源,从而加快客户端更新速度。</p> <p>有关更多详细信息,请参阅资源预加载 API。<br> <a href="https://react.dev/reference/react-dom#resource-preloading-apis" target="_blank">https://react.dev/reference/react-dom#resource-preloading-apis</a></p> <br/> <br/> <br/> <h1 id="上一篇react-19新特性和更新介绍-02---服务器组件">上一篇:React 19新特性和更新介绍 02 - 服务器组件</h1> <p><a href="https://www.cnblogs.com/eddyz/p/18724603" target="_blank">https://www.cnblogs.com/eddyz/p/18724603</a></p> <br/> <br/> <br/>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/886766.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

亲测可用,IDEA中使用满血版DeepSeek R1!支持深度思考!免费!免配置!

之前介绍过在IDEA中使用DeepSeek的方案,但是很多人表示还是用的不够爽,比如用CodeChat的方案,只支持V3版本,不支持带推理的R1。想要配置R1的话有特别的麻烦。作者:程序员 Hollis之前介绍过在IDEA中使用DeepSeek的方案,但是很多人表示还是用的不够爽,比如用CodeChat的方案…

Vscode中Eigen库的导入问题

Vscode中Eigen库的导入问题.Vscode中Eigen库的导入问题 在Vscode中,C++外部库(这里为Eigen)的导入问题主要有库的zip文件下载、在c_cpp_properties.json和tasks.json文件中进行路径配置。另外,如果运行代码使用Code Runner插件,还需要在Code Runner中进行路径配置(即使在…

最新更新!扣子(Coze)接入地表最强DeepSeek-R1大模型,超全攻略,手把手教学,完全免费教程

‍ 最新消息,国产地表最强大模型可以接入Coze平台了,今天斜杠君为大家带来了最细接入攻略,大家快学起来吧~ 备注:需要登录专业版火上引擎接入,开通专业版的同学需要开通一下。 接下来,话不多说,斜杠君用最简单的方式教给大家。 大家可以关注收藏,以免之后找不到,而且也…

1.如何在python中安装playwright

1.如何在python中安装playwright 打开pycharm,进入终端,输入如下的2个命令行代码即可自动完成playwright的安装 pip install playwright ——》在python中安装playwright第三方模块 playwright install ——》安装playwright所需的工具插件和所支持的浏览器 看到这里,是否想…

最新扣子(Coze)案例教程:DeepSeek 图像生成,用扣子应用打造超萌表情包生成器,手把手教学,完全免费教程

上一篇文章和大家分享了如何把DeepSeek-R1接入到扣子智能体中进行使用,这篇教程让我们来应用一下DeepSeek,使用DeepSeek结合工作流中的图像生成节点,打造一个表情包生成器的应用。 应用作用:输入一个人物或动物主题,生成一组表情包。 首先我们来看一下生成后的效果: 图像…

我悟了!原来本地图片预览还能这样搞

在网页开发中,经常会遇到需要让用户上传图片并在上传前进行预览的需求。这样做的好处显而易见:用户可以立即看到自己选择的图片是否正确,避免了不必要的上传和服务器资源浪费,提升了用户体验。Hey, 我是 Immerse 本文首发于 【沉浸式趣谈】,我的个人博客 https://yaolifen…

octave画高通滤波、超前,滞后补偿器的幅频响应图

octave代码非常简单:pkg load control s=tf(s); k=0.5; sysG1=k*(0.005*s)/(0.005*s+1); sysG2=k*(0.8*s+1)/(0.1*s+1); sysG3=k*(s+1)/(5*s+1); figure bode(sysG1) figure bode(sysG2) figure bode(sysG3)也可以借助循环,看如下代码:1 pkg load control2 s=tf(s);3 k=0.5;…

frame切换/窗口切换

frame切换/窗口切换 切换到frame点击这里,边看视频讲解,边学习以下内容 请大家点击这里,打开这个链接 如果我们要 选择 下图方框中 所有的 蔬菜,使用css选择,怎么写表达式? 当然,要先查看到它们的html元素特征大家可能会照旧写出如下代码:from selenium import webdriv…

选择元素的基本方法

选择元素的基本方法点击这里,边看视频讲解,边学习以下内容对于百度搜索页面,如果我们想自动化输入 白月黑羽 ,怎么做呢? 这就是在网页中,操控界面元素。 web界面自动化,要操控元素,首先需要 选择 界面元素 ,或者说 定位 界面元素 就是 先告诉浏览器,你要操作 哪个 …

操控元素的基本方法

操控元素的基本方法 点击这里,边看视频讲解,边学习以下内容选择到元素之后,我们的代码会返回元素对应的 WebElement对象,通过这个对象,我们就可以 操控 元素了。 操控元素通常包括 点击元素在元素中输入字符串,通常是对输入框这样的元素获取元素包含的信息,比如文本内容…

CClink IEF Basic设备数据 转EthernetIP项目案例

VFBOX协议转换网关支持PLC,modbus,EthernetIP,Profinet,CCLink,EtherCAT,IEC61850,IEC104,bacnet,DLT645,HJ212,opc ua,opc da,DNP3。目录 1 案例说明 1 2 VFBOX网关工作原理 1 3 准备工作 2 4 网关采集CCLINK IEF BASIC数据 2 5 使用ETHERNETIP转发数据 5 6 案例…

SciTech-EECS-BigDataAIML-NN(神经网络): Forward NN(前向传播算法)

SciTech-EECS-BigDataAIML-NN(神经网络): Forward NN(前向传播算法)