React 18新特性、Server Components、Concurrent Mode、React生态系统
本课程将详细介绍React高级主题与未来发展的相关知识和实践技巧,包括React 18的新特性、Server Components、Concurrent Mode、React生态系统的最新发展等核心内容。
// Automatic Batching
// React 18之前
function App() {
const [count, setCount] = useState(0);
const [isLoading, setIsLoading] = useState(false);
function handleClick() {
// React 17及之前只会对React事件处理器中的更新进行批处理
// 但对Promise、setTimeout等中的更新不会批处理
fetchData().then(() => {
setCount(c => c + 1); // 触发渲染
setIsLoading(false); // 触发另一次渲染
});
}
return (
{count}
);
}
// React 18
function App() {
const [count, setCount] = useState(0);
const [isLoading, setIsLoading] = useState(false);
function handleClick() {
// React 18会自动批处理所有更新,包括Promise、setTimeout等中的更新
fetchData().then(() => {
setCount(c => c + 1); // 不会立即渲染
setIsLoading(false); // 不会立即渲染
// 只有在所有更新完成后才会触发一次渲染
});
}
return (
{count}
);
}
// 禁用批处理
function App() {
const [count, setCount] = useState(0);
const [isLoading, setIsLoading] = useState(false);
function handleClick() {
fetchData().then(() => {
// 使用flushSync禁用批处理
flushSync(() => {
setCount(c => c + 1); // 立即渲染
});
// 第二次渲染
setIsLoading(false); // 立即渲染
});
}
return (
{count}
);
}
// Transitions
import { useState, startTransition } from 'react';
function App() {
const [input, setInput] = useState('');
const [results, setResults] = useState([]);
function handleInputChange(e) {
const value = e.target.value;
setInput(value);
// 将非紧急更新标记为过渡
startTransition(() => {
// 模拟搜索
setResults(searchResults(value));
});
}
return (
{results.map(result => (
- {result.name}
))}
);
}
// 使用useTransition
import { useState, useTransition } from 'react';
function App() {
const [input, setInput] = useState('');
const [results, setResults] = useState([]);
const [isPending, startTransition] = useTransition();
function handleInputChange(e) {
const value = e.target.value;
setInput(value);
startTransition(() => {
setResults(searchResults(value));
});
}
return (
{isPending ? 加载中... : (
{results.map(result => (
- {result.name}
))}
)}
);
}
// Suspense的新用法
// 1. 配合lazy加载组件
import { Suspense, lazy } from 'react';
import { BrowserRouter, Routes, Route } from 'react-router-dom';
const Home = lazy(() => import('./pages/Home'));
const About = lazy(() => import('./pages/About'));
const Dashboard = lazy(() => import('./pages/Dashboard'));
function App() {
return (
加载中... Concurrent Mode是React 18引入的一种新的渲染模式,它允许React同时处理多个任务,优先级高的任务可以打断优先级低的任务,从而提高应用的响应速度和用户体验。
// Concurrent Mode
// 1. 使用createRoot
import { createRoot } from 'react-dom/client';
import App from './App';
const root = createRoot(document.getElementById('root'));
root.render(
);
// 2. 使用startTransition
import { useState, startTransition } from 'react';
function App() {
const [count, setCount] = useState(0);
const [data, setData] = useState(null);
function handleClick() {
// 紧急更新:立即响应
setCount(c => c + 1);
// 非紧急更新:可以被打断
startTransition(() => {
// 模拟耗时操作
setData(fetchData());
});
}
return (
Count: {count}
{data && {data}}
);
}
// 3. 使用useDeferredValue
import { useState, useDeferredValue } from 'react';
function App() {
const [input, setInput] = useState('');
// 延迟更新value,使其优先级低于其他更新
const deferredValue = useDeferredValue(input);
return (
setInput(e.target.value)}
placeholder="输入..."
/>
);
}
function SlowComponent({ value }) {
// 模拟耗时操作
for (let i = 0; i < 10000000; i++) {
// 耗时计算
}
return {value};
}
Server Components是React 18引入的一种新的组件类型,它在服务器端渲染,不会包含在客户端JavaScript bundle中,从而减少客户端bundle大小,提高首屏加载速度。
// Server Components
// 1. 项目结构
// app/
// layout.js // 共享布局
// page.js // 页面组件
// components/
// ServerComponent.jsx // 服务器组件
// ClientComponent.jsx // 客户端组件
// 2. 服务器组件示例
// app/components/ServerComponent.jsx
import { fetchData } from '../lib/api';
// 服务器组件,不需要'use client'指令
export default async function ServerComponent() {
// 直接在组件中进行数据获取
const data = await fetchData();
return (
服务器组件
{data.map(item => (
- {item.name}
))}
);
}
// 3. 客户端组件示例
// app/components/ClientComponent.jsx
'use client'; // 客户端组件需要添加此指令
import { useState } from 'react';
export default function ClientComponent() {
const [count, setCount] = useState(0);
return (
客户端组件
计数: {count}
);
}
// 4. 页面组件
// app/page.jsx
import ServerComponent from './components/ServerComponent';
import ClientComponent from './components/ClientComponent';
export default function Page() {
return (
首页
);
}
| 库名称 | 特点 | 适用场景 |
|---|---|---|
| Redux Toolkit | 官方推荐,简化Redux使用 | 大型应用,复杂状态管理 |
| Zustand | 轻量级,API简洁 | 中小型应用,简单状态管理 |
| Jotai | 原子化状态管理 | 需要细粒度状态管理的应用 |
| Recoil | Facebook开发,支持派生状态 | 大型应用,复杂状态依赖 |
| Context API | React内置,无需额外依赖 | 简单的全局状态管理 |
// 代码分割
// 1. 组件级代码分割
import { lazy, Suspense } from 'react';
const HeavyComponent = lazy(() => import('./HeavyComponent'));
function App() {
return (
加载中...}>
);
}
// 2. 路由级代码分割
import { lazy, Suspense } from 'react';
import { createBrowserRouter } from 'react-router-dom';
const Home = lazy(() => import('./pages/Home'));
const About = lazy(() => import('./pages/About'));
const Dashboard = lazy(() => import('./pages/Dashboard'));
const router = createBrowserRouter([
{
path: '/',
element: (
加载中...}>
)
},
{
path: '/about',
element: (
加载中...}>
)
},
{
path: '/dashboard',
element: (
加载中...}>
)
}
]);
// 渲染优化
// 1. 使用memo优化组件渲染
import React, { memo, useMemo, useCallback } from 'react';
const ExpensiveComponent = memo(({ data, onUpdate }) => {
// 计算密集型操作
const processedData = useMemo(() => {
return data.map(item => ({ ...item, value: item.value * 2 }));
}, [data]);
// 避免在render中创建新函数
const handleUpdate = useCallback((id) => {
onUpdate(id);
}, [onUpdate]);
return (
{processedData.map(item => (
{item.name}: {item.value}
))}
);
});
// 2. 使用useCallback优化事件处理函数
import { useCallback, useState } from 'react';
function ParentComponent() {
const [count, setCount] = useState(0);
const [items, setItems] = useState([]);
// 使用useCallback缓存事件处理函数
const handleAddItem = useCallback(() => {
setItems(prev => [...prev, { id: Date.now(), name: `Item ${prev.length + 1}` }]);
}, []);
return (
Count: {count}
);
}
const ChildComponent = memo(({ onAddItem, items }) => {
console.log('ChildComponent渲染');
return (
{items.map(item => (
- {item.name}
))}
);
});
| 框架 | 特点 | 优势 | 劣势 |
|---|---|---|---|
| React | 声明式UI,组件化,生态丰富 | 生态系统强大,社区活跃,适合大型应用 | 学习曲线较陡,需要较多配置 |
| Vue | 渐进式框架,简洁易用 | 学习曲线平缓,文档完善,适合快速开发 | 生态系统相对较小,企业级应用案例较少 |
| Angular | 完整的MVC框架,TypeScript支持 | 功能完整,适合大型企业应用,TypeScript集成 | 体积较大,学习曲线陡峭,灵活性较低 |
| Svelte | 编译时框架,无虚拟DOM | 体积小,性能好,语法简洁 | 生态系统较小,成熟度较低 |
| Solid | 细粒度更新,无虚拟DOM | 性能优异,API接近React | 生态系统较小,社区规模小 |
使用React 18的新特性,实现一个搜索应用,包含以下功能:
使用Next.js 13+的App Router和Server Components,实现一个博客应用,包含以下功能:
优化一个现有React应用的性能,包含以下内容:
构建一个完整的React应用,使用最新的技术栈和最佳实践,包含以下内容:
通过本课程学习,你应该掌握了React高级主题与未来发展的核心知识和实践技巧:
React作为前端开发的主流框架,不断演进和改进,为开发者提供更好的工具和体验。保持学习的热情,紧跟技术的发展,你将能够构建更加优秀的React应用,在前端开发领域取得更大的成就。