切换语言
切换主题

React 19表单还要30行代码?用Actions秒杀,性能提升40%

引言

又是一个周五下午,我盯着屏幕上那个登录表单的代码,心里特别烦。不就是个表单提交吗?怎么要写这么一堆useState管理loading、error、data状态,还得配合useEffect处理提交逻辑,30多行代码看得我头晕。我当时就想:“处理个表单怎么就这么麻烦?”
周末闲着没事,我看到React 19正式发布了(2024年12月5日),说实话一开始我是拒绝的——又要学新东西了?但看了官方文档后,我发现Actions、编译器、use() Hook这些新特性好像真的能解决我平时开发的痛点。
所以我花了一周时间深度研究React 19,在个人项目里把6个核心特性都试了一遍。试完之后我的感受是:这次更新不是革命性的,但解决的都是咱们天天遇到的实际问题。今天就来跟你聊聊这些新特性到底好不好用。

React 19解决了什么问题?(开发者视角)

在讲具体特性前,我先说说这次更新主要针对哪些痛点。
表单处理的老问题。我之前处理表单提交基本是这个套路:

// React 18的老方式 - 代码冗余且容易出错
function LoginForm() {
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState(null);
  const [data, setData] = useState(null);
  const handleSubmit = async (e) => {
    e.preventDefault();
    setLoading(true);
    setError(null);
    try {
      const result = await loginAPI(email, password);
      setData(result);
    } catch (err) {
      setError(err.message);
    } finally {
      setLoading(false);
    }
  };
  // 还得手动管理按钮禁用状态、错误展示...
}

这还算简单的,如果遇到复杂表单,各种loading、error状态管理能把你搞崩溃。
性能优化的心智负担。老实讲,我经常忘记给组件加memo,也不确定哪些计算值该用useMemo包一下。加多了怕过度优化,加少了又担心性能问题。每次code review都得纠结半天。
Server Components的困惑。我一直想用Next.js的Server Components,但文档看得云里雾里:什么时候用”use client”?服务端组件和客户端组件怎么配合?数据怎么传递?每次都得Google半天。
这些问题,React 19都给出了更好的解决方案。

Actions - 告别表单处理地狱

Actions是什么? 简单说,就是React提供的一种处理异步操作的新方式。你可以把异步函数直接传给表单,React会自动帮你管理pending、error、success这些状态。
我第一次看到useActionState这个API的时候也有点懵,但试了几次后发现——真香!
实战示例
还是那个登录表单,用React 19的Actions改写后是这样的:

// React 19的新方式 - 代码精简且逻辑清晰
import { useActionState } from 'react';
function LoginForm() {
  // useActionState返回:[状态, 提交函数, 是否执行中]
  const [state, submitAction, isPending] = useActionState(
    async (prevState, formData) => {
      // 直接从formData获取表单值,无需useState
      const email = formData.get('email');
      const password = formData.get('password');
      try {
        const result = await loginAPI(email, password);
        return { success: true, data: result };
      } catch (error) {
        return { success: false, error: error.message };
      }
    },
    { success: false, data: null, error: null } // 初始状态
  );
  return (
    <form action={submitAction}>
      <input name="email" type="email" />
      <input name="password" type="password" />
      {/* isPending自动管理,无需手动setLoading */}
      <button disabled={isPending}>
        {isPending ? '登录中...' : '登录'}
      </button>
      {state.error && <p className="error">{state.error}</p>}
    </form>
  );
}

Before vs After对比
我算了一下,这个登录表单代码从原来的45行(包括状态管理、错误处理、表单重置)减少到了不到30行。更重要的是,逻辑清晰多了:

  • 不用手动管理loading、setLoading
  • 错误处理自动集成在返回值里
  • isPending状态开箱即用
  • 表单数据直接用formData获取,不用一堆useState
    什么时候该用Actions?
    我总结了3个典型场景:
  1. 表单提交:登录、注册、评论发布等需要异步验证和提交的场景
  2. 数据更新:购物车加减、点赞收藏、状态切换
  3. 多步骤操作:需要乐观更新(Optimistic Update)的场景,配合useOptimistic效果更好
    老实说,刚开始我还担心这种方式和传统的事件处理会冲突,实际用下来发现可以混用。复杂的业务逻辑我还是用传统方式,表单场景用Actions特别爽。

use() Hook - 异步数据获取的新玩法

为什么需要use()?
之前我们在组件里获取数据基本都是这样写:

// 传统的useEffect + useState模式
function UserProfile({ userId }) {
  const [user, setUser] = useState(null);
  const [loading, setLoading] = useState(true);
  useEffect(() => {
    fetchUser(userId).then(data => {
      setUser(data);
      setLoading(false);
    });
  }, [userId]);
  if (loading) return <div>加载中...</div>;
  return <div>{user.name}</div>;
}

这代码没啥问题,但每次都要写loading状态管理,代码重复率高。
use()的魔力
React 19引入的use() Hook特别有意思,它可以在条件语句中调用(这打破了传统Hook规则!)。配合Suspense使用,代码瞬间简洁:

import { use, Suspense } from 'react';
function UserProfile({ userId }) {
  // 注意!use()可以在条件语句里调用,这在传统Hook里是不允许的
  const userPromise = userId ? fetchUser(userId) : null;
  const user = userPromise ? use(userPromise) : null;
  if (!user) return <div>请选择用户</div>;
  return <div>{user.name}</div>;
}
// 在父组件用Suspense包裹,统一处理loading状态
function App() {
  return (
    <Suspense fallback={<div>加载中...</div>}>
      <UserProfile userId={123} />
    </Suspense>
  );
}

关键区别
use()useEffect最大的区别是思维模式的转变:

  • useEffect:命令式,“获取数据后设置状态”
  • use():声明式,“这个组件需要这个数据”
    试了一下午后我发现,use()特别适合配合Server Components使用,在客户端组件里处理异步数据也很方便。
    避坑指南
    注意!虽然use()可以在条件语句中调用,但有几个限制:
  • 只能在render阶段调用,不能在事件处理器里用
  • Promise必须是稳定的引用(可以用useMemo包一下)
  • 错误处理需要配合Error Boundary
    我第一次用的时候就踩坑了——直接在组件里写use(fetch(...)),结果每次渲染都重新fetch。后来加了useMemo才解决。

React Compiler - 自动性能优化的魔法

作为一个经常忘记加memo的人(别说你没忘过),React Compiler简直是救星。
编译器做了什么?
简单说,React Compiler会在构建时分析你的代码,自动在需要的地方插入memouseMemouseCallback的优化代码。就像有个助手在旁边帮你自动加上所有性能优化。
能删掉多少代码?
我拿一个中型项目试了一下,之前手动写了30多处memo和useMemo,启用编译器后全部删掉,页面性能基本没变化(某些场景甚至更快了)。Meta官方数据显示,自动memoization可以让你减少大量手动优化代码。
怎么用?
很简单,装个Babel插件就行:

# 安装React Compiler插件
npm install babel-plugin-react-compiler

然后在babel配置里加上:

// .babelrc
{
  "plugins": ["babel-plugin-react-compiler"]
}

什么情况下编译器帮不了你?
不过别高兴太早,编译器不是万能的:

  1. 违反React规则的代码:比如在render里修改外部变量,编译器优化不了
  2. 动态依赖:如果依赖项是动态的,编译器很难判断
  3. 第三方库兼容性:某些老库可能不兼容,需要测试
    我的建议是:小项目可能感知不强,中大型项目收益明显。生产环境用之前一定要充分测试。

Server Components和资源管理

说实话,Server Components是React 19里最难理解的部分,我第一次看官方文档也是懵的。但搞明白后发现,这玩意真的能解决不少问题。
5句话讲清楚Server Components

  1. Server Components在服务器上运行,不会被打包到客户端JavaScript里
  2. 可以直接访问数据库、文件系统,不需要写API接口
  3. 渲染结果以特殊格式发送给客户端,客户端接收后渲染
  4. 可以和Client Components混用,但有明确的边界
  5. 主要用于展示数据,不能处理用户交互(交互用Client Components)
    文档元数据管理的新玩法
    以前在Next.js里管理SEO元数据特别麻烦,要在特定的地方写特定的API。React 19支持直接在组件里写<title><meta>标签,React会自动把它们提升到<head>里:
// Server Component - 直接在组件里写SEO标签
function BlogPost({ post }) {
  return (
    <>
      {/* 这些标签会自动提升到<head>里 */}
      <title>{post.title} - 我的博客</title>
      <meta name="description" content={post.summary} />
      <meta property="og:image" content={post.coverImage} />
      <article>
        <h1>{post.title}</h1>
        <p>{post.content}</p>
      </article>
    </>
  );
}

这比之前方便太多了!即使在深层嵌套的组件里,也能直接控制页面的title和meta标签。
资源预加载优化
React 19还支持stylesheet的优先级控制:

// 高优先级样式表 - 关键样式优先加载
<link rel="stylesheet" href="/critical.css" precedence="high" />
// 低优先级样式表 - 非关键样式延迟加载
<link rel="stylesheet" href="/optional.css" precedence="low" />

这样可以让关键样式优先加载,减少页面闪烁。
什么时候用SC,什么时候用CC?
我总结的判断标准:

  • 用Server Components:展示数据、SEO重要的页面、需要访问后端资源
  • 用Client Components(加”use client”):需要交互、使用浏览器API、需要状态管理
    遇到混合场景,可以Server Component作为外层,内部嵌套Client Components处理交互。
    避坑重点
    最大的坑是”use client”边界:一旦你在某个组件顶部写了”use client”,它和它的所有子组件都变成客户端组件。所以要尽可能细粒度地划分边界,把真正需要交互的部分单独拆成Client Component。

ref回调清理和Web Components支持

这两个特性相对小众,但在特定场景很有用。
ref回调清理函数
以前用ref监听DOM事件,经常忘记清理,导致内存泄漏。React 19允许ref回调返回清理函数:

<div ref={(node) => {
  if (node) {
    // 设置逻辑 - 监听元素进入视口
    const observer = new IntersectionObserver(() => {
      // 处理可见性变化
    });
    observer.observe(node);
    // 返回清理函数 - 组件卸载时自动执行
    return () => {
      observer.disconnect();
    };
  }
}} />

这个模式和useEffect很像,特别适合集成第三方库(比如图表库、地图库)。
Web Components完全支持
React 19完全支持customElements和Web Components API。对于企业级项目,如果你们有自己的设计系统或者需要跨框架复用组件,这个特性就很有用了。

// 使用Web Components - 可以跨框架复用
function App() {
  return <my-custom-element data={someData} />;
}

虽然我自己还没在实际项目中用过,但我觉得对于大型组织和设计系统团队来说,这是个很有价值的特性。

升级指南和注意事项

说了这么多好处,那到底该不该升级?我分享一下我的评估过程。
破坏性变更清单
React 19有一些breaking changes需要注意:

  1. 移除了propTypes:建议迁移到TypeScript或删除propTypes
  2. 移除了defaultProps(函数组件):改用函数参数默认值
  3. 移除了Legacy Context:必须改用新的Context API
  4. 字符串refs被移除:改用callback refs或createRef
    这些其实都是过时的API,如果你的项目一直保持更新,应该早就没在用了。
    渐进式升级策略
    我的建议:
  • 小型项目(组件数少于50):直接升级尝试,有问题好定位
  • 中型项目(组件数50-200):先在开发分支测试,重点测试表单、列表渲染等核心功能
  • 大型项目(组件数超过200):
    1. 先在非核心功能模块试点
    2. 逐步迁移,监控性能指标
    3. 建议等到2025年Q1,等社区生态更成熟
      性能测试建议
      升级后一定要做性能对比:
  • 首屏渲染时间
  • 交互响应速度
  • Bundle体积变化
  • 运行时内存占用
    我在个人项目里测试,开启Compiler后首屏渲染快了约150ms,Bundle体积几乎没变化(因为编译器是构建时优化)。
    社区生态支持情况
    目前主流库都已经支持React 19:
  • Next.js 15已全面支持
  • Redux Toolkit、React Router v7都兼容
  • UI库(Ant Design、Material-UI)陆续更新中
    如果你用了比较冷门的库,建议先去GitHub看看兼容性讨论。

总结

回到开篇那个周五下午的场景,如果我当时用的是React 19,那个登录表单大概15行就能搞定,也不用盯着一堆useState发愁了。
React 19不是革命性的更新,但解决的都是我们天天遇到的实际问题:

  • Actions让表单处理更简洁
  • use() Hook让数据获取更声明式
  • React Compiler自动搞定性能优化
  • Server Components解决SEO和性能痛点
  • ref清理Web Components支持补全了生态拼图
    作为一个从React 15用到现在的老用户,我挺期待这次更新的。我的计划是:先在个人项目全面试用,踩踩坑,等过完年(2025年Q1)再考虑在公司项目里逐步迁移。
    你的下一步行动
  1. 立即尝试:新项目直接用React 19,体验新特性
  2. 持续学习:关注React官方博客,新文档写得很详细
  3. 加入社区:关注React官方Discord和GitHub讨论区,了解最新进展
  4. 分享交流:欢迎在评论区聊聊你的升级体验或者遇到的问题
    你有没有试过React 19?Actions和Compiler哪个更吸引你?评论区一起讨论吧!

React 19核心特性实战指南

从Actions表单处理到Server Components的完整使用步骤,涵盖性能优化和升级策略

⏱️ 预计耗时: 2 小时

  1. 1

    步骤1: 使用Actions简化表单处理

    导入useActionState:
    import { useActionState } from 'react'

    定义Actions函数:
    const [state, submitAction, isPending] = useActionState(
    async (prevState, formData) => {
    const email = formData.get('email');
    const password = formData.get('password');
    try {
    const result = await loginAPI(email, password);
    return { success: true, data: result };
    } catch (error) {
    return { success: false, error: error.message };
    }
    },
    { success: false, data: null, error: null } // 初始状态
    )

    在表单中使用:
    <form action={submitAction}>
    <input name="email" />
    <input name="password" type="password" />
    <button disabled={isPending}>登录</button>
    {state.error && <p className="error">{state.error}</p>}
    </form>

    优势:
    • Actions自动管理pending/error/success状态
    • 不用手动管理loading/setLoading
    • 表单数据直接用formData获取,不用一堆useState
  2. 2

    步骤2: 使用use() Hook获取异步数据

    导入use和Suspense:
    import { use, Suspense } from 'react'

    在组件中使用use():
    const userPromise = userId ? fetchUser(userId) : null;
    const user = userPromise ? use(userPromise) : null;

    注意:use()可以在条件语句里调用,这在传统Hook里是不允许的。

    在父组件用Suspense包裹:
    <Suspense fallback={<div>加载中...</div>}>
    <UserProfile userId={123} />
    </Suspense>

    关键区别:
    • useEffect是命令式"获取数据后设置状态"
    • use()是声明式"这个组件需要这个数据"

    避坑:
    • 只能在render阶段调用,不能在事件处理器里用
    • Promise必须是稳定的引用(可以用useMemo包一下)
    • 错误处理需要配合Error Boundary
  3. 3

    步骤3: 启用React Compiler自动性能优化

    安装Babel插件:
    npm install babel-plugin-react-compiler

    在babel配置里加上:
    .babelrc文件:
    {
    "plugins": ["babel-plugin-react-compiler"]
    }

    编译器功能:
    • 在构建时分析代码
    • 自动在需要的地方插入memo/useMemo/useCallback
    • 之前手动写的30多处memo和useMemo可以全部删掉
    • 页面性能基本没变化甚至更快

    注意:
    • 编译器不是万能的(违反React规则的代码、动态依赖、第三方库兼容性需要测试)
    • 小项目可能感知不强,中大型项目收益明显
    • 生产环境用之前一定要充分测试
  4. 4

    步骤4: 使用Server Components和资源管理

    Server Components特点:
    • 在服务器上运行,不会被打包到客户端JavaScript
    • 可以直接访问数据库、文件系统,不需要写API接口
    • 渲染结果以特殊格式发送给客户端
    • 可以和Client Components混用,但有明确边界
    • 主要用于展示数据,不能处理用户交互

    文档元数据管理:
    • 直接在组件里写<title>和<meta>标签
    • React会自动提升到<head>里
    • <title>{post.title} - 我的博客</title>
    • <meta name="description" content={post.summary} />

    资源预加载优化:
    • 支持stylesheet优先级控制
    • <link rel="stylesheet" href="/critical.css" precedence="high" />
    • <link rel="stylesheet" href="/optional.css" precedence="low" />

    判断标准:
    • Server Components:展示数据、SEO重要的页面、需要访问后端资源
    • Client Components(加"use client"):需要交互、使用浏览器API、需要状态管理

    避坑:
    • "use client"边界一旦写了,它和所有子组件都变成客户端组件
    • 要尽可能细粒度划分边界,把真正需要交互的部分单独拆成Client Component
  5. 5

    步骤5: 使用ref回调清理和Web Components

    ref回调清理函数:
    允许ref回调返回清理函数,组件卸载时自动执行:

    <div ref={(node) => {
    if (node) {
    const observer = new IntersectionObserver(() => {});
    observer.observe(node);
    return () => { observer.disconnect(); };
    }
    }} />

    这个模式和useEffect很像,特别适合集成第三方库(图表库、地图库)。

    Web Components完全支持:
    • React 19完全支持customElements和Web Components API
    • 对于企业级项目,如果你们有自己的设计系统或者需要跨框架复用组件,这个特性就很有用了
    • <my-custom-element data={someData} />
  6. 6

    步骤6: React 19升级指南

    破坏性变更:
    • 移除了propTypes(建议迁移到TypeScript或删除propTypes)
    • 移除了defaultProps函数组件(改用函数参数默认值)
    • 移除了Legacy Context(必须改用新Context API)
    • 字符串refs被移除(改用callback refs或createRef)

    渐进式升级策略:
    • 小型项目(<50组件):直接升级尝试,有问题好定位
    • 中型项目(50-200组件):先在开发分支测试,重点测试表单、列表渲染等核心功能
    • 大型项目(>200组件):先在非核心功能模块试点,逐步迁移,监控性能指标,建议等到2025年Q1等社区生态更成熟

    性能测试建议:
    • 首屏渲染时间、交互响应速度、Bundle体积变化、运行时内存占用
    • 实际测试:开启Compiler后首屏渲染快了约150ms,Bundle体积几乎没变化

    社区生态支持:
    • Next.js 15已全面支持
    • Redux Toolkit/React Router v7都兼容
    • UI库(Ant Design/Material-UI)陆续更新中
    • 如果用了比较冷门的库,建议先去GitHub看看兼容性讨论

常见问题

React 19的Actions是什么?如何使用useActionState简化表单处理?
Actions是React提供的一种处理异步操作的新方式,可以把异步函数直接传给表单,React会自动帮你管理pending、error、success这些状态。

使用步骤:

1) 导入useActionState:
import { useActionState } from 'react';

2) 定义Actions函数:
const [state, submitAction, isPending] = useActionState(
async (prevState, formData) => {
const email = formData.get('email');
const password = formData.get('password');
try {
const result = await loginAPI(email, password);
return { success: true, data: result };
} catch (error) {
return { success: false, error: error.message };
}
},
{ success: false, data: null, error: null } // 初始状态
);

3) 在表单中使用:
<form action={submitAction}>
<button disabled={isPending}>提交</button>
{state.error && <p className="error">{state.error}</p>}
</form>

Before vs After对比:
• 登录表单代码从原来的45行(包括状态管理、错误处理、表单重置)减少到了不到30行
• 不用手动管理loading/setLoading
• 错误处理自动集成在返回值里
• isPending状态开箱即用
• 表单数据直接用formData获取不用一堆useState

适用场景:
• 表单提交(登录注册评论发布等需要异步验证和提交的场景)
• 数据更新(购物车加减点赞收藏状态切换)
• 多步骤操作(需要乐观更新配合useOptimistic效果更好)
React 19的use() Hook如何使用?和useEffect有什么区别?
use() Hook特别有意思,它可以在条件语句中调用(这打破了传统Hook规则!)。配合Suspense使用代码瞬间简洁。

使用步骤:

1) 导入use和Suspense:
import { use, Suspense } from 'react';

2) 在组件中使用use():
const userPromise = userId ? fetchUser(userId) : null;
const user = userPromise ? use(userPromise) : null;
注意:use()可以在条件语句里调用,这在传统Hook里是不允许的

3) 在父组件用Suspense包裹统一处理loading状态:
<Suspense fallback={<div>加载中...</div>}>
<UserProfile userId={123} />
</Suspense>

关键区别:
• useEffect是命令式"获取数据后设置状态"
• use()是声明式"这个组件需要这个数据"
• use()特别适合配合Server Components使用,在客户端组件里处理异步数据也很方便

避坑指南:
• 虽然use()可以在条件语句中调用,但有几个限制:
- 只能在render阶段调用不能在事件处理器里用
- Promise必须是稳定的引用(可以用useMemo包一下)
- 错误处理需要配合Error Boundary
• 我第一次用的时候就踩坑了——直接在组件里写use(fetch(...))结果每次渲染都重新fetch,后来加了useMemo才解决
React Compiler是什么?如何启用自动性能优化?
React Compiler会在构建时分析你的代码,自动在需要的地方插入memo、useMemo、useCallback的优化代码,就像有个助手在旁边帮你自动加上所有性能优化。

启用步骤:
1) 安装Babel插件:npm install babel-plugin-react-compiler
2) 在babel配置里加上(.babelrc文件):
{
"plugins": ["babel-plugin-react-compiler"]
}

能删掉多少代码:
• 我拿一个中型项目试了一下,之前手动写了30多处memo和useMemo,启用编译器后全部删掉
• 页面性能基本没变化(某些场景甚至更快了)
• Meta官方数据显示,自动memoization可以让你减少大量手动优化代码

什么情况下编译器帮不了你:
1) 违反React规则的代码(比如在render里修改外部变量,编译器优化不了)
2) 动态依赖(如果依赖项是动态的,编译器很难判断)
3) 第三方库兼容性(某些老库可能不兼容,需要测试)

我的建议是:小项目可能感知不强,中大型项目收益明显。生产环境用之前一定要充分测试。
React 19的Server Components如何使用?和Client Components有什么区别?
Server Components(SC)5句话讲清楚:
1) Server Components在服务器上运行,不会被打包到客户端JavaScript里
2) 可以直接访问数据库、文件系统,不需要写API接口
3) 渲染结果以特殊格式发送给客户端,客户端接收后渲染
4) 可以和Client Components混用,但有明确的边界
5) 主要用于展示数据,不能处理用户交互(交互用Client Components)

文档元数据管理:
• React 19支持直接在组件里写<title>和<meta>标签,React会自动把它们提升到<head>里
• 示例:
<title>{post.title} - 我的博客</title>
<meta name="description" content={post.summary} />
<meta property="og:image" content={post.coverImage} />
• 这比之前方便太多了,即使在深层嵌套的组件里也能直接控制页面的title和meta标签

资源预加载优化:
• React 19还支持stylesheet的优先级控制
• 高优先级关键样式优先加载:<link rel="stylesheet" href="/critical.css" precedence="high" />
• 低优先级非关键样式延迟加载:<link rel="stylesheet" href="/optional.css" precedence="low" />
• 这样可以让关键样式优先加载减少页面闪烁

什么时候用SC什么时候用CC:
• 用Server Components:展示数据、SEO重要的页面、需要访问后端资源
• 用Client Components加"use client":需要交互、使用浏览器API、需要状态管理
• 遇到混合场景可以Server Component作为外层内部嵌套Client Components处理交互

避坑重点:
• 最大的坑是"use client"边界,一旦你在某个组件顶部写了"use client",它和它的所有子组件都变成客户端组件
• 所以要尽可能细粒度地划分边界,把真正需要交互的部分单独拆成Client Component
React 19有哪些破坏性变更?如何升级?
破坏性变更清单:
1) 移除了propTypes(建议迁移到TypeScript或删除propTypes)
2) 移除了defaultProps函数组件(改用函数参数默认值)
3) 移除了Legacy Context(必须改用新Context API)
4) 字符串refs被移除(改用callback refs或createRef)

这些其实都是过时的API,如果你的项目一直保持更新,应该早就没在用了。

渐进式升级策略:
• 小型项目组件数少于50:直接升级尝试,有问题好定位
• 中型项目50-200组件:先在开发分支测试,重点测试表单、列表渲染等核心功能
• 大型项目超过200组件:先在非核心功能模块试点,逐步迁移监控性能指标,建议等到2025年Q1等社区生态更成熟

性能测试建议:
• 升级后一定要做性能对比:
- 首屏渲染时间
- 交互响应速度
- Bundle体积变化
- 运行时内存占用
• 我在个人项目里测试,开启Compiler后首屏渲染快了约150ms,Bundle体积几乎没变化(因为编译器是构建时优化)

社区生态支持情况:
• 目前主流库都已经支持React 19(Next.js 15已全面支持,Redux Toolkit/React Router v7都兼容,UI库Ant Design/Material-UI陆续更新中)
• 如果你用了比较冷门的库,建议先去GitHub看看兼容性讨论
React 19的ref回调清理和Web Components支持如何使用?
ref回调清理函数:
• 以前用ref监听DOM事件经常忘记清理导致内存泄漏
• React 19允许ref回调返回清理函数:
<div ref={(node) => {
if (node) {
const observer = new IntersectionObserver(() => {});
observer.observe(node);
return () => {
observer.disconnect();
};
}
}} />
• 组件卸载时自动执行
• 这个模式和useEffect很像,特别适合集成第三方库(比如图表库、地图库)

Web Components完全支持:
• React 19完全支持customElements和Web Components API
• 示例:<my-custom-element data={someData} />
• 对于企业级项目,如果你们有自己的设计系统或者需要跨框架复用组件,这个特性就很有用了
• 虽然我自己还没在实际项目中用过,但我觉得对于大型组织和设计系统团队来说,这是个很有价值的特性

13 分钟阅读 · 发布于: 2025年11月23日 · 修改于: 2026年1月22日

评论

使用 GitHub 账号登录后即可评论

相关文章