Skip to content
📖预计阅读时长:0 分钟字数:0

React 并发模式

专家篇第 2 章:掌握 React 18 的并发特性。

返回 React学习路线 | 上一章 React-13-源码解析 | 下一章 React-15-服务端渲染


一、并发模式概述

1.1 什么是并发渲染

  • 可中断渲染:长任务可以被高优先级任务打断
  • 优先级调度:紧急更新优先处理
  • 后台渲染:不阻塞用户交互

1.2 启用并发模式

jsx
// React 18 默认启用
import { createRoot } from 'react-dom/client';

const root = createRoot(document.getElementById('root'));
root.render(<App />);

二、useTransition

2.1 区分紧急和非紧急更新

jsx
import { useState, useTransition } from 'react';

function SearchPage() {
  const [query, setQuery] = useState('');
  const [results, setResults] = useState([]);
  const [isPending, startTransition] = useTransition();

  const handleChange = (e) => {
    const value = e.target.value;
    
    // 紧急更新:立即响应输入
    setQuery(value);
    
    // 非紧急更新:可以延迟
    startTransition(() => {
      setResults(searchData(value));
    });
  };

  return (
    <div>
      <input value={query} onChange={handleChange} />
      {isPending && <span>Loading...</span>}
      <ResultList results={results} />
    </div>
  );
}

三、useDeferredValue

3.1 延迟更新值

jsx
import { useState, useDeferredValue } from 'react';

function SearchResults({ query }) {
  // query 变化时,deferredQuery 会延迟更新
  const deferredQuery = useDeferredValue(query);
  const isStale = query !== deferredQuery;

  return (
    <div style=\{\{ opacity: isStale ? 0.5 : 1 \}\}>
      <ExpensiveList query={deferredQuery} />
    </div>
  );
}

四、Suspense

4.1 数据获取

jsx
import { Suspense } from 'react';

function App() {
  return (
    <Suspense fallback={<Loading />}>
      <UserProfile />
    </Suspense>
  );
}

// 配合支持 Suspense 的数据获取库
function UserProfile() {
  const user = use(fetchUser()); // React 19 的 use hook
  return <div>{user.name}</div>;
}

4.2 嵌套 Suspense

jsx
<Suspense fallback={<PageSkeleton />}>
  <Header />
  <Suspense fallback={<ContentSkeleton />}>
    <MainContent />
  </Suspense>
  <Suspense fallback={<SidebarSkeleton />}>
    <Sidebar />
  </Suspense>
</Suspense>

五、并发特性对比

特性用途
useTransition标记非紧急状态更新
useDeferredValue延迟派生值的更新
Suspense声明式加载状态

使用场景

场景推荐方案
搜索输入useTransition
列表筛选useDeferredValue
数据加载Suspense
Tab 切换useTransition

六、最佳实践

jsx
// 搜索场景的最佳实践
function Search() {
  const [query, setQuery] = useState('');
  const deferredQuery = useDeferredValue(query);

  return (
    <div>
      <input
        value={query}
        onChange={(e) => setQuery(e.target.value)}
      />
      <Suspense fallback={<Loading />}>
        <Results query={deferredQuery} />
      </Suspense>
    </div>
  );
}

下一步


#React #并发模式 #useTransition #Suspense