2022-12-20 11:08:14
EACT(应为React)性能模式的核心技巧是利用React内置工具和策略优化渲染、加载及状态管理,每个开发人员都应掌握这些经过验证的方法并合理实施。以下是具体技巧及实施方式:
1. 缓存计算与函数引用(useMemo/useCallback)useMemo:缓存高开销计算结果(如排序、过滤),仅在依赖项变化时重新计算。
useCallback:缓存函数引用,避免传递给子组件时因引用变化导致不必要的渲染。
const ExpensiveComponent = ({ items }) => { const sortedList = useMemo(() => items.sort((a, b) => a.price - b.price), [items]); const handleClick = useCallback(() => console.log('item clicked:', sortedList[0]), [sortedList]); return <ChildComponent onClick={handleClick} />;};动态导入:通过React.lazy和Suspense实现组件按需加载。
路由级分割:基于路由拆分代码,仅加载当前路由所需模块。
const HeavyChartLibrary = React.lazy(() => import('./ChartComponent'));const Dashboard = () => ( <React.Suspense fallback={<Spinner />}> {showCharts && <HeavyChartLibrary />} </React.Suspense>);动态高度项目使用VariableSizeList。
结合响应式容器调整列表尺寸。
React 18自动批量更新:默认合并同一事件循环中的状态更新。
手动控制:使用ReactDOM.flushSync强制同步更新(罕见场景)。
复杂状态管理:通过useReducer集中更新多个状态。
const [state, dispatch] = useReducer(reducer, initialState);dispatch({ type: 'update_both', count: 1, text: 'updated' });拆分Context:将独立状态分离到不同Context中。
记忆化Provider值:使用useMemo缓存Provider的值对象。
const ThemeProvider = ({ children }) => { const [theme, setTheme] = useState('light'); const value = useMemo(() => ({ theme, setTheme }), [theme]); return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>;};立即更新UI:假设API调用成功,先渲染临时状态。
错误回滚:若API失败,恢复至更新前状态。
const addTodo = async (text) => { const tempId = Date.now(); setTodos(prev => [...prev, { id: tempId, text, status: 'pending' }]); try { const savedTodo = await api.saveTodo(text); setTodos(prev => prev.map(t => t.id === tempId ? savedTodo : t)); } catch (error) { setTodos(prev => prev.filter(t => t.id !== tempId)); }};Q:useMemo与useCallback如何选择?A:useMemo缓存值,useCallback缓存函数,二者依赖项数组逻辑相同。
Q:React 18自动批量更新是否总生效?A:默认生效,但异步操作(如setTimeout内的更新)需手动包裹flushSync。
Q:何时应避免虚拟化?A:列表项数量较少(如<100)或项目高度差异极大时。
通过针对性应用这些技巧,可显著提升React应用的性能、内存效率及用户体验,适用于Next.js、Gatsby等主流技术栈。记住:优先优化关键路径,避免过早优化。