React 19---- 新特性

122 阅读2分钟

1. React 编译器

背景:React18 引入并发渲染,但还需要手动添加useMemo和useCallback优化性能。React19的编译器(React Compiler)通过分析JSX和JavaScript代码,自动应用Memoization,减少不必要的重渲染。

工作原理:

  • 编译器将 JSX 转换为优化的 JavaScript 代码,分析组件的依赖关系。
  • 自动为组件和 Hook 添加 Memoization,无需手动调用 useMemo 或 useCallback
  • 支持条件渲染、循环和动态依赖的优化。
// 传统方式:手动使用 useMemo
function DocumentList({ documents }) {
  const filteredDocs = useMemo(() => {
    return documents.filter(doc => doc.title.includes('Report'));
  }, [documents]);

  return <ul>{filteredDocs.map(doc => <li key={doc.id}>{doc.title}</li>)}</ul>;
}

// React 19:编译器自动优化
function DocumentList({ documents }) {
  const filteredDocs = documents.filter(doc => doc.title.includes('Report'));
  return <ul>{filteredDocs.map(doc => <li key={doc.id}>{doc.title}</li>)}</ul>;
}

2.服务器组件

工作原理:

  • 使用 "use server" 指令标记服务器组件。
  • 服务器组件运行在服务器端,不包含客户端交互逻辑(如 useState)。
  • 与客户端组件("use client")结合,实现混合渲染。
// src/components/DocumentList.server.tsx

// "use server";
export async function DocumentList() {
  const documents = await fetchDocuments(); // 服务器端获取数据
  return (
    <ul>
      {documents.map(doc => <li key={doc.id}>{doc.title}</li>)}
    </ul>
  );
}

3.Actions

背景:传统React表单处理需要手动管理状态和异步逻辑,React19 引入Actions,通过 formAction 属性和 useActionState Hook 简化异步操作。

工作原理:

  • 使用 <form action={handleSubmit}> 指定异步处理函数。
  • useActionState 管理表单状态和提交结果。
  • useFormStatus 提供表单提交状态(如 pending)。
import { useActionState } from 'react';

async function searchDocuments(formData) {
  const query = formData.get('query');
  // 模拟搜索
  return await fetchDocuments(query);
}

function SearchForm() {
  const [state, formAction] = useActionState(searchDocuments, null);

  return (
    <form action={formAction}>
      <input name="query" type="text" aria-label="搜索文档" />
      <button type="submit">搜索</button>
      {state && <p>结果: {state.length} 条记录</p>}
    </form>
  );
}

4.新Hook

  • use Hook:
    • 允许在渲染中直接读取 Promise 或 Context,支持条件调用。
    • 示例:const data = use(fetchData());
  • useActionState:
    • 管理表单提交的状态和结果。
    • 示例:const [state, formAction] = useActionState(submitForm, initialState);
  • useFormStatus:
    • 提供表单提交状态(如 pending)。
    • 示例:<button disabled={status.pending}>提交</button>
  • useOptimistic:
    • 实现乐观更新,立即显示更新结果,等待异步确认。
    • 示例:const [optimisticState, updateOptimistic] = useOptimistic(currentState);

5.文档元数据管理

背景:React 19 原生支持 <title><meta> 和 <link>标签,自动提升到 <head>

6.资源加载优化

背景:资源加载(如脚本、样式、字体)可能导致页面闪烁或延迟。React 19 引入 preload 和 preinit API,用于异步加载资源。

工作原理:

  • preload: 预加载资源(如图片、字体),但不执行。
  • preinit: 预加载并立即初始化(如脚本、样式)。