父组件每渲染生成新对象会触发 effect 循环
循环链
子组件 effect 回填本地草稿
→ 调父组件更新回调
→ 父组件 setItems([...]) 生成新对象/新数组
→ selectedItem 引用变化
→ 传给子组件的 callback 引用变化
→ 子组件 effect 依赖变化,再次执行
→ 回到第一步(无限)
判据与做法
- 现象是
Maximum update depth exceeded,堆栈会指向某个在 effect 里反复触发的更新函数。 - 关键是引用稳定性:父组件每渲染生成新对象/新数组,会让
memo失效、让 effect 依赖「每次都变」。 - 修法方向:内容没变就不要更新父 state(先比较再 set),或用稳定引用(
useCallback/useMemo/规范化更新),并补一个锁住「内容没变不更新父 state」的测试。
相关
- 条件return前必须调用所有hooks —— 另一类 React 渲染期约束
- 流式更新要合并字段而非替换对象 —— 同属「整体替换 vs 稳定更新」问题
- 编辑即时反馈与落盘延迟分离 —— 另一类 React effect / 状态回填的时序陷阱