key 怎样影响状态保留和重置?
先理解原理和示例,再练习完整口述与追问。
回答要点
状态归属于渲染树中的位置与组件身份;同位置、同类型、同 key 通常保留状态,改变 key 可有意重置。列表 key 只需同级唯一,不能用随机 key 强迫所有组件每次重建。
原理拆解
React 根据组件在树中的位置、类型和 key 等信息判断状态是否延续。同一位置同类型同 key 通常复用实例状态;类型或 key 改变可以触发重建。key 在兄弟范围提供身份,不是传入组件内部的普通业务 prop,需要 ID 时仍应显式传递。
示例与推演
编辑器从 userA 切换 userB 时,如果草稿不应保留,可使用 <Editor key={user.id} user={user} /> 让身份随记录改变;如果需要在用户间切换时保留各自草稿,就应把草稿按 ID 存在上层,而不是依靠任意 key 猜测。列表用 index 排序后容易让输入状态与记录错位。
易错点
不要每次 render 使用 Math.random 作 key。重建会丢失焦点、未提交输入与资源实例;需要保留或重置哪一层状态,要按产品语义决定。
参考回答可直接练习口述
React 按 UI 树的位置、组件类型和 key 识别组件身份。同身份通常保留 Hook 状态,移除、换类型或换 key 可以重置。列表用稳定业务 key,让状态跟随数据而不是位置。也可以有意给编辑器加 userId 作为 key,使切换用户时重新初始化,但要知道这样也会重建整个子树。
面试官可能继续问追问与完整解答展开收起
追问
切换不同用户的编辑表单如何重置?为什么在组件内部定义另一个组件函数可能导致状态反复重置?React 官方状态保留与重置
追问回答
切换用户表单若需要全量重置,可用稳定的 userId key,或设计显式重置流程。组件函数定义在另一个组件函数里,每次渲染会产生新的函数类型,React 可能把它视为不同组件并重建;组件定义通常放在模块层。