React 18 发布(新版本-开箱即用)

586 阅读4分钟

react.png 3 月 29 日,React 18 正式发布,此版本包括开箱即用的改进,如自动批处理,新的 API(如 startTransition)和支持 Suspense 的流式服务器端渲染

在 React 18 中,用户可以开始使用 Suspense 在 Relay、Next.js、Hydrogen 或 Remix 等框架中获取数据。使用 Suspense 获取临时数据在技术上是可行的,但官方表示不建议将其作为一般策略

开发团队称,其对 Suspense 的愿景始终不仅仅是加载代码——目标是扩展对 Suspense 的支持,以便最终相同的声明式 Suspense fallback 可以处理任何异步操作(加载代码、数据、图像等)。

而服务器组件的开发仍处于测试阶段,它允许开发人员构建跨服务器和客户端的应用程序,将客户端应用程序的丰富交互性与传统服务器渲染的改进性能相结合。此功能预计将在 18.x 次要版本中发布初始版本。

其对 Suspense 的愿景始终不仅仅是加载代码——目标是扩展对 Suspense 的支持,以便最终相同的声明式 Suspense fallback 可以处理任何异步操作(加载代码、数据、图像等)。

React 18 新功能

自动批处理

批处理是 React 将多个状态更新分组到一个重新渲染中以获得更好的性能。如果没有自动批处理,我们只能在 React 事件处理程序中批处理更新。

默认情况下,Promise、setTimeout、native event handlers 或任何其他事件内部的更新不会在 React 中批处理。使用自动批处理,这些更新将自动批处理:

// Before: only React events were batched.
setTimeout(() => {
  setCount(c => c + 1);
  setFlag(f => !f);
  // React will render twice, once for each state update (no batching)
}, 1000);

// After: updates inside of timeouts, promises,
// native event handlers or any other event are batched.`
setTimeout(() => {
  setCount(c => c + 1);
  setFlag(f => !f);
  // React will only re-render once at the end (that's batching!)
}, 1000);

Transitions

Transitions 是 React 中的一个新概念,用于区分 urgent 和 non-urgent updates。

urgent updates 反映了直接交互,例如 typing、clicking、pressing等

Transition updates 将 UI 从一个视图转换到另一个视图

<ul>
	<li><strong>Urgent updates </strong>反映了直接交互,例如 typing、clicking、pressing等</li>
	<li><strong>Transition updates </strong>将 UI 从一个视图转换到另一个视图</li>
</ul>
import {startTransition} from 'react';

// Urgent: Show what was typed
setInputValue(input);

// Mark any state updates inside as transitions
startTransition(() => {
  // Transition: Show the results
  setSearchQuery(input);
});

新的 Suspense 功能。 如果组件树的一部分尚未准备好显示,Suspense 允许你以声明方式指定组件树的加载状态:

Suspense 使“UI loading state”成为 React 编程模型中的 first-class 声明性概念。这让我们可以在它之上构建更高级别的功能。

在 React 18 中,服务器添加了对 Suspense 的支持,并使用并发渲染特性扩展了它的功能。React 18 中的 Suspense 与 transition API 结合使用时效果最佳。如果你在 transition 期间 suspend,React 将防止已经可见的内容被 fallback 替换。

相反,React 会延迟渲染,直到加载了足够的数据以防止出现错误的加载状态。

<Suspense fallback={<Spinner />}>
  <Comments />
</Suspense>

新的客户端和服务器渲染 API

在这个版本中,开发团队重新设计了他们为在客户端和服务器上呈现而公开的 API。这些更改允许用户在升级到 React 18 中的新 API 时继续使用 React 17 模式下的旧 API。

新的严格模式行为

此功能将为 React 应用程序提供更好的开箱即用性能,但要求组件能够对多次挂载和销毁的效果具有弹性。大多数效果无需任何更改即可工作,但有些效果假定它们只挂载或销毁一次。为了帮助解决这些问题,React 18 为严格模式引入了一个新的仅限开发的检查。

每当第一次安装组件时,此新检查将自动卸载并重新安装每个组件,并在第二次安装时恢复先前的状态。

* React mounts the component.
  * Layout effects are created.
  * Effects are created.
* React simulates unmounting the component.
  * Layout effects are destroyed.
  * Effects are destroyed.
* React simulates mounting the component with the previous state.
  * Layout effects are created.
  * Effects are created.

详细内容请翻阅官方文档.

react官网(reactjs.org/)

react中文网(zh-hans.reactjs.org/)