题目重点:从稳定Hook槽位解释规则,区分render计算与外部同步,避免遗漏依赖和订阅泄漏。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 训练常规useState/useEffect等Hook在组件或custom Hook顶层调用;特殊API规则依官方接口,不一概泛化。
解题路线
- 常规Hook需要每次render保持调用顺序,不能条件/循环改变某个state/effect出现位置。要按条件影响行为,可把条件放Hook内部或拆独立组件,配合lint。
- function render形成当前props/state快照,事件/异步闭包会保留该次值;依据旧state更新可用函数式setter,需要持续可变非UI引用可用ref,但不滥用ref隐藏状态。
- render应纯计算,effect同步网络/订阅/DOM外部系统,cleanup撤销上一setup。依赖数组包含使用的反应式值,漏依赖不是优化而是可能陈旧。
- 请求竞态要处理旧响应晚到、组件卸载或查询改变;取消/序号判断避免旧结果覆盖新状态。effect cleanup不自动让所有Promise不可再写。
- 自定义Hook复用逻辑而非全局共享同一state,调用实例仍有自己状态;若需跨组件store,应明确共享数据源与订阅合同。
- 开发严格模式可能额外setup/cleanup暴露不对称问题,不应删检查来藏泄漏;验证正常、参数变化、取消与卸载路径。
手动走一遍
条件决定是否订阅,但useEffect本身保持每次调用,effect内判断enabled并返回对应清理。搜索A后B,A慢返回时不能覆盖B结果,需要请求身份控制。
规模与取舍
每render Hook数量应固定,具体effect成本由订阅/IO/计算决定;漏清理会累计资源,与Hook是否简洁无关。
易错点与追问
容易失分的边界
- 条件里调用常规Hook。
- 空依赖数组隐藏变化。
- custom Hook所有调用共享同一state。
继续深挖
- ref/state怎样选?
- 旧请求怎样取消/忽略?
- effect不对称如何复现?
技术参考
- React Rules of Hooks:技术语义参考,具体题目按本文约定。
