download:2023 React 18 系统入门 进阶实战《欢乐购》
## **React 18 的新特性**
`React 18` 是 `React` 的最新版本,它带来了许多新的特性和改进,如并发渲染、自动批处理、转场 `API`、服务端 `Suspense` 等。这些特性可以让你的 `React` 应用更快、更流畅、更易用。本文将介绍如何使用 `React 18` 的新特性,以及如何升级你的现有的 React 应用。
#### **升级到 React 18**
`React 18 `的升级过程是渐进式的,也就是说,你可以选择性地启用` React 18 `的新特性,而不会影响你现有的代码。`React 18` 的核心变化是引入了一个新的并发渲染器,它可以让 `React` 在后台准备多个 UI 版本,然后根据优先级选择合适的版本展示给用户。并发渲染器是可选的,只有当你使用了一个并发特性时,它才会启用。
要升级到 `React 18`,你需要做以下几个步骤:
1.安装 `React 18 `和 `React DOM 18`。你可以使用 `npm` 或 `yarn` 来安装它们:
```
npm install react@18.0.0 react-dom@18.0.0
```
或者
`yarn add react@18.0.0 react-dom@18.0.0`
2.使用 `createRoot` 替换 `render`。在你的 `index.js` 文件中,把 `ReactDOM.render` 改成 `ReactDOM.createRoot` 来创建一个根实例,然后用 `root.render` 来渲染你的应用。例如:
```
// 旧的方式
import ReactDOM from 'react-dom';
import App from './App';
const container = document.getElementById('root');
ReactDOM.render(, container);
// 新的方式
import ReactDOM from 'react-dom/client';
import App from './App';
const container = document.getElementById('root');
// 创建一个根实例
const root = ReactDOM.createRoot(container);
// 渲染应用到根实例
root.render();
```
3.测试你的应用是否正常工作。如果你没有使用任何并发特性,那么你的应用应该和之前一样运行,没有任何变化。如果你遇到了任何问题,你可以查看 `React 18` 升级指南。
#### **使用并发特性**
如果你想使用` React 18 `的并发特性,你需要做一些额外的配置和修改。并发特性包括:
* 自动批处理:`React 18` 可以自动将多个状态更新合并为一个批次,从而减少不必要的重渲染和闪烁。
* 转场 API:`React 18` 提供了一个新的 `useTransition hook`,让你可以标记那些不需要立即更新的 `UI` 变化,并给用户一个加载提示。
* 服务端 `Suspense:React 18` 支持在服务端使用 `Suspense` 组件来实现数据获取和代码分割,并且可以流式地发送 HTML 到客户端。
下面我们分别介绍这些特性的使用方法和示例代码。
#### **自动批处理**
自动批处理是 `React 18` 的一个默认特性,也就是说,你不需要做任何配置就可以享受它带来的好处。自动批处理可以让 `React` 在同一个事件循环中将多个状态更新合并为一个批次,从而避免不必要的重渲染和闪烁。例如,在下面这个计数器组件中,我们有两个按钮分别增加或减少计数器的值:
```
import { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
function increment() {
setCount(count + 1);
}
function decrement() {
setCount(count - 1);
}
return (
Count: {count}
-
);
}
```
在 `React 17 `中,如果我们同时点击两个按钮,那么计数器的值会先变成 1,然后再变成 0,因为每次状态更新都会触发一次渲染。这会导致用户看到一个闪烁的效果,影响用户体验。在 `React 18` 中,如果我们同时点击两个按钮,那么计数器的值会直接变成 0,因为 React 会自动将两次状态更新合并为一个批次,只触发一次渲染。这样就可以避免闪烁的效果,提升用户体验。
#### **转场 API**
转场 `API 是 React 18` 提供的一个新的` hook`,叫做 `useTransition`。它可以让你标记那些不需要立即更新的 UI 变化,并给用户一个加载提示。例如,在下面这个组件中,我们有一个按钮可以切换主题颜色:
```
import { useState } from 'react';
function ThemeSwitcher() {
const [theme, setTheme] = useState('light');
function toggleTheme() {
setTheme(theme === 'light' ? 'dark' : 'light');
}
return (
Current theme: {theme}
Toggle theme
);
}
```
复制
在` React 17` 中,如果我们点击切换主题的按钮,那么整个页面的颜色会立即改变。这可能会让用户感到突兀和不舒服。在 `React 18` 中,我们可以使用 `useTransition` 来让主题切换更加平滑和自然。我们可以这样修改代码:
```
import { useState, useTransition } from 'react';
function ThemeSwitcher() {
const [theme, setTheme] = useState('light');
// 使用 useTransition 创建一个转场
const [startTransition, isPending] = useTransition();
function toggleTheme() {
// 在转场中执行状态更新
startTransition(() => {
setTheme(theme === 'light' ? 'dark' : 'light');
});
}
return (
Current theme: {theme}
{/* 根据 isPending 的值显示加载提示 */}
{isPending &&
Loading...
}
Toggle theme
);
}
```
复制
在这个例子中,我们使用 `useTransition` 创建了一个转场,它返回了两个值:`startTransition` 和 `isPending`。`startTransition` 是一个函数,它接受一个回调函数作为参数,在回调函数中执行状态更新。`isPending` 是一个布尔值,它表示转场是否正在进行中。当我们点击切换主题的按钮时,`React` 不会立即更新 UI,而是会等待一段时间(默认是 150 毫秒),然后再更新 UI。在等待的过程中,React 会显示一个加载提示(Loading…),让用户知道正在发生什么。这样就可以让主题切换更加平滑和自然。
#### **服务端 Suspense**
服务端 `Suspense` 是 `React 18` 支持在服务端使用 `Suspense` 组件来实现数据获取和代码分割,并且可以流式地发送 `HTML` 到客户端。`Suspense` 是 `React` 提供的一个特殊的组件,它可以让你延迟渲染某些组件,直到它们的数据或代码准备好。例如,在下面这个组件中,我们使用 Suspense 来渲染一个用户列表:
```
import { Suspense } from 'react';
import UserList from './UserList';
function App() {
return (
Users
{/* 使用 Suspense 包裹 UserList 组件 */}
Loading...}>
```