# React 19 新特性详解

React 19 是 React 的最新重大版本,带来了一系列激动人心的新特性和改进。本文将详细介绍 React 19 的主要新功能。

# 📋 目录

  1. use hook
  2. Server Components
  3. Server Actions
  4. Ref as Prop
  5. Actions API
  6. Suspense 改进
  7. 编译器优化
  8. use hook 详解

# 1. use hook

React 19 引入了全新的 use hook,这是一个用于读取资源状态的革命性 API。

# 基本用法

import { use } from 'react';

function Comments({ commentsResource }) {
  const comments = use(commentsResource);
  return <ul>{comments.map(c => <li key={c.id}>{c.text}</li>)}</ul>;
}

# 特性

  • 同步读取use 可以同步读取 Promise 或 Context
  • ** Suspense 集成**:自动与 Suspense 配合使用
  • 条件调用:可以在条件语句和回调中调用

# 与 useEffect 的区别

特性 use useEffect
调用时机 同步 异步
条件调用 ✅ 支持 ❌ 不支持
返回值 资源值 cleanup 函数

# 2. Server Components

服务器组件允许你在服务器上渲染组件,减少客户端 bundle 大小。

# 基本示例

// Server Component (.server.jsx)
import { db } from './database';

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

# 优势

  • 🚀 零 bundle 大小:服务器组件不会增加客户端 bundle
  • 💾 直接数据库访问:可以直接查询数据库
  • 🔒 敏感逻辑安全:敏感逻辑可以在服务器上处理

# 3. Server Actions

Server Actions 允许直接从客户端组件调用服务器端函数。

# 基本用法

// actions.js
'use server';

export async function addToCart(productId, quantity) {
  await db.cart.add(productId, quantity);
  return { success: true };
}

// Component.jsx
'use client';
import { addToCart } from './actions';

function AddToCartButton({ productId }) {
  return (
    <button onClick={() => addToCart(productId, 1)}>
      Add to Cart
    </button>
  );
}

# 特性

  • 类型安全:自动推断参数和返回类型
  • 🔄 渐进式增强:即使 JS 加载失败也能工作
  • 📊 自动重验证:数据变更后自动重验证相关数据

# 4. Ref as Prop

React 19 允许将 ref 作为普通 prop 传递给组件。

# 以前的方式(需转发 ref)

// 以前需要使用 forwardRef
const FancyButton = forwardRef((props, ref) => (
  <button ref={ref} className="fancy">
    {props.children}
  </button>
));

# React 19 新方式

// 直接接收 ref 作为 prop
function FancyButton({ ref, children }) {
  return <button ref={ref} className="fancy">{children}</button>;
}

// 使用
<FancyButton ref={buttonRef}>Click me</FancyButton>

# 优势

  • 📦 简化代码:不再需要 forwardRef
  • 🎯 明确意图:ref 作为显式 prop,意图更清晰
  • 🔧 灵活性:可以在组件内部决定如何使用 ref

# 5. Actions API

新的 Actions API 简化了表单处理和数据变更。

# 基本用法

import { useActionState } from 'react';

async function addToCart(prevState, formData) {
  const productId = formData.get('productId');
  const quantity = formData.get('quantity');
  
  try {
    await addToCart(productId, quantity);
    return { success: true, message: '添加成功' };
  } catch (error) {
    return { success: false, message: '添加失败' };
  }
}

function AddToCartForm() {
  const [state, action, isPending] = useActionState(addToCart, null);
  
  return (
    <form action={action}>
      <input type="text" name="productId" />
      <input type="number" name="quantity" />
      <button disabled={isPending}>
        {isPending ? '添加中...' : '添加'}
      </button>
      {state?.message && <p>{state.message}</p>}
    </form>
  );
}

# 6. Suspense 改进

React 19 对 Suspense 进行了重大改进,使其更加强大和可靠。

# 流式渲染

import { Suspense } from 'react';
import { Post } from './Post';

<PostPage>
  <Suspense fallback={<Skeleton />}>
    <Post id={postId} />
  </Suspense>
</PostPage>

# 改进点

  • 🎯 更精确的边界:Suspense 边界更精确
  • 更快的恢复:组件准备好后更快恢复渲染
  • 🦋 更好的错误处理:改进的错误边界支持

# 7. 编译器优化

React 19 编译器进行了重大升级,自动优化更多场景。

# 自动 memoization

// 以前需要手动 memo
const ExpensiveComponent = memo(function ExpensiveComponent({ data }) {
  // 复杂计算
});

// React 19 编译器自动优化
function ExpensiveComponent({ data }) {
  // 复杂计算 - 编译器自动跳过不必要的重新渲染
}

# 优化范围

  • 📊 自动记忆:自动识别并记忆纯组件
  • 🔍 依赖追踪:精确追踪状态变化
  • 死代码消除:移除未使用的代码

# 8. use hook 详解

深入了解 use hook 的高级用法。

# 读取 Promise

function UserProfile({ userPromise }) {
  const user = use(userPromise);
  
  if (!user) {
    return <div>加载中...</div>;
  }
  
  return (
    <div>
      <h2>{user.name}</h2>
      <p>{user.bio}</p>
    </div>
  );
}

// 使用
<UserProfile userPromise={fetchUser(userId)} />

# 读取 Context

const ThemeContext = createContext(null);

function ThemedContent() {
  const theme = use(ThemeContext);
  return <div className={theme}>主题内容</div>;
}

# 错误处理

function AsyncContent({ promise }) {
  try {
    const data = use(promise);
    return <div>{data}</div>;
  } catch (error) {
    return <ErrorBoundary error={error} />;
  }
}

# 📚 总结

React 19 为开发者带来了许多强大的新特性:

特性 作用
use hook 更灵活的资源读取方式
Server Components 减少 bundle 大小
Server Actions 简化服务器通信
Ref as Prop 简化 ref 使用
Actions API 更好的表单处理
Suspense 改进 更好的用户体验
编译器优化 自动性能优化

# 升级建议

  1. 逐步升级:从新项目开始使用 React 19
  2. 📖 阅读文档:详细了解每个新特性
  3. 🧪 充分测试:确保现有代码兼容
  4. 🔄 渐进式采用:选择适合团队的新特性

# 参考资源


💡 提示:React 19 向下兼容大多数 React 18 代码,升级相对平滑。建议在生产环境使用前充分测试。

相关文章推荐: