447 字
2 分钟
11 · 工程实战与常见坑

这些年我排过的雷#

1. 无限重渲染#

const [cfg, setCfg] = useState({});
useEffect(() => {
setCfg(loadCfg()); // 每次渲染都 set 新对象 → 又触发渲染 → 死循环
}, []);

修复:依赖写全、或把”非响应式”的初始化放 useState(() => loadCfg()),不在 effect 里无条件 set。

2. 该派生就不存 state#

const [fullName, setFullName] = useState(""); // ❌ 多余
// ✅ 直接派生
const fullName = `${first} ${last}`;

存储可派生的数据,状态一多就难同步、易错。

3. 过度使用 Context#

把”用户、主题、语言、布局”全塞一个 Context,任一处变化全部消费者重渲染。拆成多个细粒度 Context,或用状态库按需订阅。

4. StrictMode 双调用困惑#

开发模式下 StrictMode 会故意双调用渲染、effect(挂载→卸载→再挂载)以暴露副作用泄漏。看到”请求发两次”先确认是不是它,清理函数写对就不会有问题。


工程检查清单#

  • 列表 key 用稳定 id,非 index。
  • useEffect 依赖数组写全,清理函数齐全。
  • 派生数据不进 state。
  • memo/useMemo/useCallback 按测量结论加,不滥用。
  • 长列表虚拟滚动;首屏代码分割。
  • 全局状态先评估是否真需要库。

小结#

  • 无限循环多因”effect 里无条件 setState + 依赖不全”。
  • 能派生的不存 state;Context 拆细,避免广播重渲染。
  • StrictMode 双调用是帮你找 bug,清理写对即可。
  • 性能靠测量,不靠感觉;清单化自查更稳。

练习#

  1. 故意制造一个无限重渲染,用 Profiler 看调用栈,再用正确依赖修复。
  2. 把一个”全量 Context”拆成 UserContext + ThemeContext,验证只改主题时用户组件不重渲染。
  3. 列出你当前项目里”可派生却存了 state”的地方并改造。
11 · 工程实战与常见坑
http://117.72.32.87/blog/posts/react-roadmap-11-engineering-pitfalls/
作者
Ethan
发布于
2026-09-30
许可协议
CC BY-NC-SA 4.0