React 19 新特性解析:更简洁高效的前端开发体验

更新日期: 2025-11-16 阅读: 29 标签: 特性

react 19 已于2024年12月正式发布,这是两年多来的第一个主要版本,为开发者带来了许多令人期待的新功能和改进。


Actions:简化异步操作处理

Actions 是 React 19 中最显著的变化之一,它为处理异步操作提供了全新的模式。在过去,开发者需要手动管理加载状态、错误处理以及乐观更新,现在 React 能自动处理这些逻辑。

使用 useActionState

新的 useActionState Hook 让异步状态管理变得更加简单:

import { useActionState } from 'react';

function UpdateName() {
  const [error, submitAction, isPending] = useActionState(
    async (previousState, formData) => {
      const error = await updateName(formData.get("name"));
      if (error) {
        return error;
      }
      redirect("/profile");
      return null;
    },
    null,
  );

  return (
    <form action={submitAction}>
      <input type="text" name="name" />
      <button type="submit" disabled={isPending}>Update</button>
      {error && <p>{error}</p>}
    </form>
  );
}

Actions 能够与表单原生协作,只需将异步函数传递给 action 属性,React 就会自动追踪 pending 状态。


新增的 Hooks

useoptimistic:即时 UI 更新

useOptimistic Hook 允许在等待服务器响应时立即更新 UI,提供更流畅的用户体验:

function Thread({ messages }) {
  const [optimisticMessages, addOptimistic] = useOptimistic(
    messages,
    (state, newMessage) => [...state, { text: newMessage, pending: true }]
  );

  async function sendMessage(formData) {
    const message = formData.get("message");
    addOptimistic(message);
    await deliverMessage(message);
  }

  return (
    <>
      {optimisticMessages.map((msg, i) => (
        <div key={i} style={{ opacity: msg.pending ? 0.5 : 1 }}>
          {msg.text}
        </div>
      ))}
      <form action={sendMessage}>
        <input name="message" />
      </form>
    </>
  );
}

use:更灵活的读取方式

use Hook 用于读取 Promise 或 Context,与普通 Hooks 不同,它可以在条件语句中调用:

function Message({ messagePromise }) {
  const message = use(messagePromise);
  return <p>{message}</p>;
}


更便捷的 Ref 传递

React 19 中不再需要 forwardRef,可以像传递普通 prop 一样传递 ref:

function Input({ ref, ...props }) {
  return <input ref={ref} {...props} />;
}

这一改进简化了组件间 ref 传递的代码


文档元数据管理

现在可以在组件中直接设置标题、meta 标签和链接,React 会自动将它们提升到 <head>:

function BlogPost({ post }) {
  return (
    <article>
      <title>{post.title}</title>
      <meta name="description" content={post.excerpt} />
      <h1>{post.title}</h1>
      <p>{post.content}</p>
    </article>
  );
}


资源加载优化

样式表和脚本处理

React 现在能更好地处理资源加载,样式表和脚本不会阻塞 Suspense 边界内的渲染:

function ComponentWithStyle() {
  return (
    <>
      <link rel="stylesheet" href="styles.css" precedence="default" />
      <article>内容在这里,直到 styles.css 加载完成后才会显示</article>
    </>
  );
}

precedence 属性用于控制多个样式表的加载顺序。

资源预加载

新增了一组函数用于预加载资源:

import { prefetchDNS, preconnect, preload, preinit } from 'react-dom';

function AppRoot() {
  preinit('https://example.com/script.js', { as: 'script' });
  preload('https://example.com/font.woff', { as: 'font' });

  return <App />;
}


服务器组件正式支持

React 19 完全支持服务器环境中的异步组件。它们在服务器端运行,并将 html 发送给客户端:

async function BlogPost({ id }) {
  const post = await db.posts.find(id);
  return (
    <article>
      <h1>{post.title}</h1>
      <p>{post.content}</p>
    </article>
  );
}

目前,只有像 Next.js 这样的框架支持这一特性。


React Compiler:自动性能优化

React Compiler 是一个新的构建时工具,它可以自动优化你的 React 应用。它理解 React 的规则,因此你无需重写任何代码即可使用它。

手动优化 vs 编译器优化

React 19 之前的手动优化:

import { useMemo, useCallback, memo } from 'react';

const ExpensiveComponent = memo(function ExpensiveComponent({ data, onClick }) {
  const processedData = useMemo(() => {
    return expensiveProcessing(data);
  }, [data]);

  const handleClick = useCallback((item) => {
    onClick(item.id);
  }, [onClick]);

  return (
    <div>
      {processedData.map(item => (
        <Item key={item.id} onClick={() => handleClick(item)} />
      ))}
    </div>
  );
});

使用 React Compiler 后:

function ExpensiveComponent({ data, onClick }) {
  const processedData = expensiveProcessing(data);

  const handleClick = (item) => {
    onClick(item.id);
  };

  return (
    <div>
      {processedData.map(item => (
        <Item key={item.id} onClick={() => handleClick(item)} />
      ))}
    </div>
  );
}

React 编译器会自动应用等效的优化,确保你的应用只在必要时重新渲染。

编译器的作用

React 编译器主要专注于两种优化场景:

  1. 跳过组件的级联重新渲染 - 避免父组件更新导致整个子树重新渲染

  2. 跳过来自 React 外部的昂贵计算 - 自动记忆化渲染期间使用的昂贵计算


移除的过时 api

React 19 删除了一些旧的 API:

  • propTypes - 建议使用 TypeScript 或其他类型检查方案

  • defaultProps - 使用 ES6 默认参数替代

  • contextTypes 和 getChildContext - 使用 Context.Provider

  • 字符串形式的 ref - 使用回调 ref 或 createRef


升级指南

安装

要安装 React 19,运行:

npm install --save-exact react@^19.0.0 react-dom@^19.0.0

如果你使用 TypeScript,还需要更新类型定义:

npm install --save-exact @types/react@^19.0.0 @types/react-dom@^19.0.0

破坏性变更

大多数代码无需修改,但需要注意以下几点:

  • 渲染中的错误现在会冒泡到最近的错误边界,而不是仅记录日志

  • 即使组件在 effect 执行前卸载,useEffect 的清理函数也会执行

  • ref 回调在清理阶段会收到 null


是否应该升级?

如果你正在启动新项目,推荐直接使用 React 19。对于现有应用,可以在合适的时间升级。大多数功能保持兼容,新特性能让常见模式更简洁。

React Compiler 目前是可选的,需要单独安装:

npm install -D babel-plugin-react-compiler@rc

编译器目前处于 RC 阶段,但已在 Meta 等公司的生产环境中使用。


总结

React 19 带来了许多令人兴奋的改进,特别是 Actions 模式简化了异步操作处理,React Compiler 提供了自动性能优化,加上对服务器组件的正式支持,使 React 开发体验更加简洁高效。无论是新项目还是现有项目,都值得考虑升级到 React 19,以享受这些新特性带来的开发便利和性能提升。

本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!

链接: https://fly63.com/article/detial/13184

CSS新特性contain,控制页面的重绘与重排

contain 属性允许我们指定特定的 DOM 元素和它的子元素,让它们能够独立于整个 DOM 树结构之外。目的是能够让浏览器有能力只对部分元素进行重绘、重排,而不必每次都针对整个页面。

Html5、Css3、ES6的新特性

Html5的新特性语义化标签:有利于SEO,有助于爬虫抓取更多的有效信息,爬虫是依赖于标签来确定上下文和各个关键字的权重。表单新特性,多媒体视频(video)和音频(audio)

ES6新特性--var、let、const

var不存在块级作用域,具有变量提升机制。 let和const存在块级作用域,不存在变量提升。在同一作用域内只能声明一次。const在声明时需要赋值且无法修改,但如果常量是对象,则对象的属性可以修改。

Js即将到来的3个新特性

Optional Chaining(可选链式调用);Nullish coalescing(空值合并);Pipeline operator(管道运算符)通过三个函数对字符串进行处理;

Angular 8的新特性介绍

在今天早些时候Angular团队发布了8.0.0稳定版。其实早在NgConf 2019大会上,演讲者就已经提及了从工具到差分加载的许多内容以及更多令人敬畏的功能。下面是我对8.0.0一些新功能的简单介绍,希望可以帮助大家快速了解新版本

使用 React 要懂的 Js特性

与我使用的其他框架相比,我最喜欢 React 的原因之一就是它对 JavaScript 的暴露程度。没有模板DSL( JSX 编译为合理的 JavaScript),组件 API 只是通过添加 React Hooks 变得更简单,并且该框架为解决的核心 UI 问题提供非常少的抽象概念

ES2019 新特性汇总

最近 ECMAScript2019,最新提案完成:tc39 Finished Proposals,我这里也是按照官方介绍的顺序进行整理,如有疑问,可以查看官方介绍啦~另外之前也整理了 《ES6/ES7/ES8/ES9系列》,可以一起看哈。

Js的用途和特性

JavaScript 最初的目的是为了“赋予网页生命”。这种编程语言我们称之为脚本。它们可以写在 HTML 中,在页面加载的时候会自动执行。脚本作为纯文本存在和执行。它们不需要特殊的准备或编译即可运行。

十个超级实用的 JS 特性

你可能刚上手 JavaScript,或者只是曾经偶尔用过。不管怎样,JavaScript 改变了很多,有些特性非常值得一用。 这篇文章介绍了一些特性,在我看来,一个严肃的 JavaScript 开发者每天都多多少少会用到这些特性

解密HTTP/2与HTTP/3 的新特性

HTTP/2 相比于 HTTP/1.1,可以说是大幅度提高了网页的性能,只需要升级到该协议就可以减少很多之前需要做的性能优化工作,当然兼容问题以及如何优雅降级应该是国内还不普遍使用的原因之一。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!