在 React 中提升渲染性能,核心思路是 减少不必要的渲染、降低渲染成本、合理使用并发与缓存。下面按「常见手段 → 原理 → 示例」的方式系统总结。
React.memo避免父组件更新导致子组件无谓渲染。
const Child = React.memo(function Child({ value }) {
return <div>{value}</div>;
});
✅ 适合:纯展示组件
❌ 不适合:props 经常变化(对象/函数)
useMemo / useCallback避免每次渲染都创建新对象或函数。
const data = useMemo(() => heavyCompute(), [dep]);
const onClick = useCallback(() => {}, [dep]);
⚠️ 不要滥用,简单计算反而更慢。
大组件一变全变,拆小组件只变局部。
function List({ items }) {
return items.map(i => <Item key={i.id} item={i} />);
}
key 正确错误 key 会导致重建 DOM。
✅ 用稳定 id
❌ 用 index(列表会乱)
只渲染可视区域。
react-windowreact-virtualized@tanstack/react-virtualimport { FixedSizeList } from 'react-window';
✅ 万级数据必备
IntersectionObserver// ❌ 全局 state 一变全变
// ✅ 局部 state
比 Redux 更细粒度更新。
const count = useStore(s => s.count);
startTransition非紧急更新不阻塞 UI。
startTransition(() => {
setHeavyState(next);
});
useDeferredValue延迟不重要的值。
const deferred = useDeferredValue(value);
useLayoutEffect 谨慎useLayoutEffect 同步阻塞渲染。
const Page = React.lazy(() => import('./Page'));
why-did-you-renderReact 性能优化 = 让该渲染的渲染,不该渲染的别渲染。
如果你有具体场景(表单 / 表格 / 大列表 / 后台系统),我可以给你更针对性的方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。