React Concurrent Mode 是什么?怎么使用?

React Concurrent Mode(并发模式)是 React 的一种底层架构模式,它允许 React 中断、暂停、恢复甚至放弃正在进行的渲染工作,从而优化应用在复杂场景下的用户体验。

简单来说,Concurrent Mode 让 React 能够 "同时" 处理多个渲染任务(实际上是通过时间切片模拟并行),并根据任务的优先级调整执行顺序,比如优先响应用户输入(点击、输入等),而延迟处理耗时的渲染工作,避免页面卡顿。

核心特点:

  • 可中断渲染:渲染过程可以被高优先级任务(如用户交互)打断
  • 优先级调度:不同类型的更新有不同优先级(如动画 > 数据更新)
  • ** Suspense 增强 **:配合 Suspense 实现更强大的异步加载能力
  • Transitions:区分紧急更新(如输入框输入)和非紧急更新(如筛选结果)

如何使用(基于 React 18+):

React 18 中,Concurrent Mode 不再是一个需要手动开启的模式,而是通过新的根 API 自动启用。以下是关键用法:

  1. 启用 Concurrent Mode(React 18+)
javascript 复制代码
// 旧方式(不支持并发模式)
import ReactDOM from'react-dom';
ReactDOM.render(<App />, document.getElementById('root'));

// 新方式(自动启用并发特性)
import ReactDOM from'react-dom/client';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<App />); // 此时已支持并发特性
  1. 使用 useTransition 区分更新优先级
javascript 复制代码
import { useState, useTransition } from'react';

function SearchComponent() {
  const [input, setInput] = useState('');
  const [results, setResults] = useState([]);
  const [isPending, startTransition] = useTransition();

  // 处理输入(紧急更新)
  const handleInput = (e) => {
    setInput(e.target.value);
    
    // 标记为非紧急更新(会被用户交互打断)
    startTransition(() => {
      // 模拟耗时的筛选操作
      const filteredResults = heavySearchOperation(e.target.value);
      setResults(filteredResults);
    });
  };

  return (
    <div>
      <input value={input} onChange={handleInput} />
      {isPending? <p>加载中...</p> : (
        <ul>
          {results.map(item => <li key={item.id}>{item.name}</li>)}
        </ul>
      )}
    </div>
  );
}
  1. 配合 Suspense 实现数据加载
javascript 复制代码
import { Suspense } from'react';
import DataComponent from './DataComponent';

function App() {
  return (
    <div>
      <h1>我的应用</h1>
      {/* 当 DataComponent 加载数据时显示 fallback */}
      <Suspense fallback={<div>加载数据中...</div>}>
        <DataComponent />
      </Suspense>
    </div>
  );
}

// DataComponent.js(使用 Suspense 兼容的数据获取)
function fetchData() {
  // 模拟异步请求
  return new Promise(resolve => {
    setTimeout(() => resolve({ name: "示例数据" }), 1000);
  });
}

const resource = {
  data: fetchData()
};

function DataComponent() {
  // 当数据未准备好时,会触发 Suspense 的 fallback
  const data = resource.data.read();
  return <div>{data.name}</div>;
}

注意事项:

  • React 18 中已不再需要通过 ReactDOM.createRoot 以外的方式手动开启 Concurrent Mode

  • 并发特性主要通过 useTransition、Suspense、startTransition 等 API 体现

  • 不是所有场景都需要使用并发特性,简单应用可能感受不到明显差异

  • 一些第三方库可能需要更新以支持并发模式

通过 Concurrent Mode,React 应用能够在处理复杂操作时保持流畅的用户交互,特别适合数据量大、更新频繁的应用场景。

相关推荐
devincob25 分钟前
js原生、vue导出、react导出、axios ( post请求方式)跨平台导出下载四种方式的demo
javascript·vue.js·react.js
编程社区管理员26 分钟前
React 发送短信验证码和验证码校验功能组件
前端·javascript·react.js
葡萄城技术团队28 分钟前
迎接下一代 React 框架:Next.js 16 核心能力解读
javascript·spring·react.js
全马必破三33 分钟前
React“组件即函数”
前端·javascript·react.js
三思而后行,慎承诺35 分钟前
React 底层原理
前端·react.js·前端框架
座山雕~35 分钟前
html 和css基础常用的标签和样式
前端·css·html
灰小猿1 小时前
Spring前后端分离项目时间格式转换问题全局配置解决
java·前端·后端·spring·spring cloud
im_AMBER2 小时前
React 16
前端·笔记·学习·react.js·前端框架
02苏_2 小时前
ES6模板字符串
前端·ecmascript·es6
excel2 小时前
⚙️ 一次性警告机制的实现:warnOnce 源码深度解析
前端