0

0

React 19 中的新增功能

DDD

DDD

发布时间:2024-12-10 22:42:10

|

778人浏览过

|

来源于dev.to

转载

react 19 中的新增功能

行动

react 应用程序中的一个常见用例是执行数据突变,然后更新状态作为响应。例如,当用户提交表单以更改其姓名时,您将发出 api 请求,然后处理响应。过去,您需要手动处理挂起状态、错误、乐观更新和顺序请求。

例如,您可以在 usestate 中处理挂起和错误状态:

// before actions
function updatename({}) {
  const [name, setname] = usestate("");
  const [error, seterror] = usestate(null);
  const [ispending, setispending] = usestate(false);

  const handlesubmit = async () => {
    setispending(true);
    const error = await updatename(name);
    setispending(false);
    if (error) {
      seterror(error);
      return;
    } 
    redirect("/path");
  };

  return (
    
setname(event.target.value)} /> {error &&

{error}

}
); }

在 react 19 中,我们添加了对在转换中使用异步函数的支持,以自动处理挂起状态、错误、表单和乐观更新。

例如,您可以使用 usetransition 为您处理挂起状态:

// using pending state from actions
function updatename({}) {
  const [name, setname] = usestate("");
  const [error, seterror] = usestate(null);
  const [ispending, starttransition] = usetransition();

  const handlesubmit = () => {
    starttransition(async () => {
      const error = await updatename(name);
      if (error) {
        seterror(error);
        return;
      } 
      redirect("/path");
    })
  };

  return (
    
setname(event.target.value)} /> {error &&

{error}

}
); }

异步转换将立即将 ispending 状态设置为 true,发出异步请求,并在任何转换后将 ispending 切换为 false。这使您可以在数据更改时保持当前 ui 的响应能力和交互性。

笔记

按照惯例,使用异步转换的函数称为“操作”。
操作会自动为您管理提交数据:

挂起状态:操作提供一个挂起状态,该状态在请求开始时启动,并在提交最终状态更新时自动重置。
乐观更新:操作支持新的 useoptimistic 挂钩,因此您可以在提交请求时向用户显示即时反馈。
错误处理:操作提供错误处理,以便您可以在请求失败时显示错误边界,并自动将乐观更新恢复为其原始值。
表单:

元素现在支持将函数传递给 action 和 formaction 属性。将函数传递给操作属性默认使用操作,并在提交后自动重置表单。

基于 actions 构建,react 19 引入了 useoptimistic 来管理乐观更新,并引入了一个新的钩子 react.useactionstate 来处理 actions 的常见情况。在react-dom中,我们添加了

actions来自动管理表单,并使用formstatus来支持表单中actions的常见情况。

在 react 19 中,上面的例子可以简化为:

// using  actions and useactionstate
function changename({ name, setname }) {
  const [error, submitaction, ispending] = useactionstate(
    async (previousstate, formdata) => {
      const error = await updatename(formdata.get("name"));
      if (error) {
        return error;
      }
      redirect("/path");
      return null;
    },
    null,
  );

  return (
    
      
      
      {error && 

{error}

} ); }

在下一节中,我们将详细介绍 react 19 中的每个新 action 功能。

新钩子:useactionstate

为了使操作的常见情况更容易,我们添加了一个名为 useactionstate 的新钩子:

const [error, submitaction, ispending] = useactionstate(
  async (previousstate, newname) => {
    const error = await updatename(newname);
    if (error) {
      // you can return any result of the action.
      // here, we return only the error.
      return error;
    }

    // handle success
    return null;
  },
  null,
);

useactionstate 接受一个函数(“action”),并返回一个包装的 action 来调用。这是有效的,因为动作是组合的。当调用被包装的 action 时,useactionstate 会返回该 action 的最后结果作为数据,并将该 action 的挂起状态作为挂起。

笔记

react.useactionstate 以前在 canary 版本中称为 reactdom.useformstate,但我们已重命名它并弃用了 useformstate。

请参阅#28491 了解更多信息。
有关更多信息,请参阅 useactionstate 的文档。

react dom:

操作

actions 还与 react 19 的 react-dom 的新

功能集成。我们添加了对传递函数作为
}> ) }

笔记

use 不支持渲染中创建的 promise。
如果你尝试传递在渲染中创建的 promise 来使用,react 会发出警告:

error
a component was suspended by an uncached promise. creating promises
inside a client component or hook is not yet supported, except via a
suspense-compatible library or framework.

要修复此问题,您需要从支持缓存 promise 的 suspense 支持的库或框架传递 promise。将来,我们计划发布一些功能,以便更轻松地在渲染中缓存 promise。

您还可以使用 use 来读取上下文,允许您有条件地读取上下文,例如在提前返回后:

import {use} from 'react';
import themecontext from './themecontext'

function heading({children}) {
  if (children == null) {
    return null;
  }

  // this would not work with usecontext
  // because of the early return.
  const theme = use(themecontext);
  return (
    

{children}

); }

use api只能在render中调用,类似于hooks。与钩子不同,use 可以有条件地调用。未来我们计划支持更多在渲染和使用中消耗资源的方式。

更多信息请参阅使用文档。

新的 react dom 静态 api

我们在react-dom/static中添加了两个新的api来生成静态站点:

  • 预渲染
  • prerendertonodestream

这些新 api 通过等待数据加载以生成静态 html 来改进 rendertostring。它们旨在与 node.js streams 和 web streams 等流环境配合使用。例如,在 web stream 环境中,您可以使用 prerender 将 react 树预渲染为静态 html:

import { prerender } from 'react-dom/static';

async function handler(request) {
  const {prelude} = await prerender(, {
    bootstrapScripts: ['/main.js']
  });
  return new Response(prelude, {
    headers: { 'content-type': 'text/html' },
  });
}

预渲染 api 将等待所有数据加载,然后返回静态 html 流。流可以转换为字符串,或与流响应一起发送。他们不支持加载流媒体内容,这是

反应服务器组件

服务器组件

服务器组件是一个新选项,允许在捆绑之前在与客户端应用程序或 ssr 服务器分开的环境中提前渲染组件。这个单独的环境是 react server components 中的“服务器”。服务器组件可以在构建时在 ci 服务器上运行一次,也可以使用 web 服务器针对每个请求运行。

react 19 包含 canary 通道中包含的所有 react server 组件功能。这意味着随服务器组件一起提供的库现在可以将 react 19 作为对等依赖项,并具有反应服务器导出条件,以便在支持全栈 react 架构的框架中使用。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

340

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1503

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

625

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

655

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

610

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

173

2025.07.29

c++字符串相关教程
c++字符串相关教程

本专题整合了c++字符串相关教程,阅读专题下面的文章了解更多详细内容。

83

2025.08.07

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

54

2026.01.31

热门下载

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

精品课程

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

共46课时 | 3.1万人学习

HTML+CSS基础与实战
HTML+CSS基础与实战

共132课时 | 9.9万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.2万人学习

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

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