Frontend / MLE · Technical Fundamentals

TikTok Hooks:调用顺序、状态闭包与 Effect 清理

从稳定Hook槽位解释规则,区分render计算与外部同步,避免遗漏依赖和订阅泄漏。

题目重点:从稳定Hook槽位解释规则,区分render计算与外部同步,避免遗漏依赖和订阅泄漏。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 训练常规useState/useEffect等Hook在组件或custom Hook顶层调用;特殊API规则依官方接口,不一概泛化。

解题路线

  1. 常规Hook需要每次render保持调用顺序,不能条件/循环改变某个state/effect出现位置。要按条件影响行为,可把条件放Hook内部或拆独立组件,配合lint。
  2. function render形成当前props/state快照,事件/异步闭包会保留该次值;依据旧state更新可用函数式setter,需要持续可变非UI引用可用ref,但不滥用ref隐藏状态。
  3. render应纯计算,effect同步网络/订阅/DOM外部系统,cleanup撤销上一setup。依赖数组包含使用的反应式值,漏依赖不是优化而是可能陈旧。
  4. 请求竞态要处理旧响应晚到、组件卸载或查询改变;取消/序号判断避免旧结果覆盖新状态。effect cleanup不自动让所有Promise不可再写。
  5. 自定义Hook复用逻辑而非全局共享同一state,调用实例仍有自己状态;若需跨组件store,应明确共享数据源与订阅合同。
  6. 开发严格模式可能额外setup/cleanup暴露不对称问题,不应删检查来藏泄漏;验证正常、参数变化、取消与卸载路径。

手动走一遍

条件决定是否订阅,但useEffect本身保持每次调用,effect内判断enabled并返回对应清理。搜索A后B,A慢返回时不能覆盖B结果,需要请求身份控制。

规模与取舍

每render Hook数量应固定,具体effect成本由订阅/IO/计算决定;漏清理会累计资源,与Hook是否简洁无关。

易错点与追问

容易失分的边界

  • 条件里调用常规Hook。
  • 空依赖数组隐藏变化。
  • custom Hook所有调用共享同一state。

继续深挖

  • ref/state怎样选?
  • 旧请求怎样取消/忽略?
  • effect不对称如何复现?

技术参考

✓已复制微信号!