React 18 的异步自动批处理与 React 17 有什么区别,为什么还要看根 API?
通过 Promise 和定时器内的两个状态更新比较 React 17、React 18 createRoot 与旧入口,说明自动批处理的观察方法和 await 边界。
React面试题第 6 页,显示第 251–281 题,共找到 281 道完整解析,可继续按分类、标签与关键词缩小范围。
按稳定语义路径排序
通过 Promise 和定时器内的两个状态更新比较 React 17、React 18 createRoot 与旧入口,说明自动批处理的观察方法和 await 边界。
以两个关联设置的点击更新解释批处理,说明中间状态、不同点击事件边界、严格模式日志与实际提交,并区分性能合并和业务事务。
围绕“React 中用三元表达式在同一位置渲染两个同类型组件(如条件里都是 <Counter />),为什么 state ”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须指出同位置同类型会被视为同一组件从而复用 state,并给出需要区分时用 key 或不同位置的修复。
围绕“为什么能从已有 state 或 props 计算出的值,不应该再单独存一份 React state”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明冗余 state 会产生两份可能不一致的事实来源、需要在每次更新时手动同步,渲染期间直接计算即可。
通过显示输入框后立即聚焦解释 flushSync 的同步 DOM 边界,区分 DOM 已提交与局部 state 快照,并说明额外工作、Effect 和 Suspense 的代价。
用两个并发保存任务解释函数式更新如何组合加减计数,区分队列中的前一状态与闭包中的其他变量,并说明直接设置确定值仍然合理。
围绕“想在 React 中临时隐藏一个组件但保留它的 state,有哪些做法、各自取舍是什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须对比 CSS 隐藏(保留 DOM 与 state)与条件渲染(销毁 state),以及把 state 上移到不卸载的父组件的方案。
围绕“为什么使用 Immer(useImmer)后可以直接「修改」draft,却仍然满足 React 的不可变更新要求”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 Immer 通过 Proxy 记录对 draft 的修改并产出带结构共享的新对象、原 state 未被改动。
围绕“什么条件下 React 列表用数组下标作为 key 是可以接受的”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须给出列表静态不重排、不增删、项为纯展示且子组件无内部 state 这组前提,并说明为何违反任一条就应改用稳定 ID。
围绕“React 列表用数组下标作为 key,在插入、删除或排序时会出现什么具体问题”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须诊断出下标随位置变化导致 key 与数据错位、无 key 子组件的 state(如输入框内容)被错误复用到别的行。
围绕“React 中同一个组件被渲染两次(页面上两个 <Counter />),为什么它们的 state 互不影响”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 state 按树中位置独立存储、组件函数只是模板,并指出把 state 定义在模块级会被共享的反例。
围绕“React 中把组件移到树中不同的父节点下,即使 key 不变,为什么 state 仍然丢失”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 key 只在同一父级的兄弟比较中生效、跨父节点属于不同位置的卸载与新建。
围绕“如何利用 React 的 key 在不卸载整个页面的情况下重置某个组件的全部 state”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明改变 key 让 React 把其视为新实例并重建 state 树,并给出典型场景(如切换选中项时重置表单)。
围绕“为什么 React 的 key 只需在兄弟节点间唯一,且子组件内部读不到自己的 key”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 key 是 React 用于匹配的保留信息而不传递给组件,需要该值时应另传一个 prop。
围绕“在 React 的组件身份判断中,key 与组件类型分别起什么作用、改变哪一个会重置 state”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明位置+类型+key 共同决定实例身份:类型或 key 任一变化都会重建 state,而 key 仅用于区分同位置同类型的兄弟实例。
围绕“React 渲染列表时为什么要求每个元素带 key,React 用 key 做什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 key 让 React 在多次渲染间把新旧子元素一一对应以复用 DOM 与 state,缺 key 时退化为按下标对应。
围绕“React 中多个相关的值应该用多个 useState 还是合并成一个对象 state,如何取舍”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须给出按「是否总是一起更新、字段数量是否确定」取舍的判断标准,并指出对象 state 每次更新需整体替换的代价。
围绕“在 React 中直接修改 state 对象的属性(如 user.name = 'x'),为什么界面不会更新”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须指出 React 靠 set 函数触发渲染且用引用比较判断变化,原地修改既不入队也产生不了新引用。
用个人资料中的城市字段解释变更路径复制和结构共享,通过引用比较核对根、父对象、子对象与未变分支,并讨论数组、动态键和深拷贝代价。
围绕“React 的 useState 更新对象时为什么不会自动合并字段,与 class 组件的 this.setStat”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须指出 hook 的 set 函数整体替换状态值、需要手动展开旧对象,而 class 的 setState 对顶层字段做浅合并。
围绕“为什么 React 组件重新渲染时 state 不会丢,而从 UI 树中移除后再加回来就丢了”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 state 保存在 React 内部并按组件在树中的位置关联而非存在组件函数里,移除即销毁。
围绕“为什么 React 要求组件的渲染过程保持纯净,在渲染中修改 state 或外部变量会有什么问题”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明渲染可能被打断、重放或在 Strict Mode 下执行两次,渲染期改动会导致结果不一致,副作用应放到事件或 effect 中。
围绕“React 组件会在什么情况下重新渲染,修改一个普通局部变量为什么不触发渲染”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须列出组件自身 state 更新与父组件重新渲染两类触发源,并说明局部变量在渲染间不被保留所以不参与。
解释 useState 的 Object.is 相等判断,区分相同值跳过更新与函数绝不调用,用零、负零和 NaN 展示比较边界,并连接对象状态的引用问题。
围绕“React 中允许在渲染期间调用本组件 setState 的唯一合理模式是什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须给出「根据 props 变化在渲染中调整自身 state」的受控模式(存上一次的 props 并条件调用),并说明它替代 effec。
围绕“为什么说 React 的 setState 与 dispatch 函数引用是稳定的,这对依赖数组和 props 传递”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 React 保证这两个函数跨渲染引用不变,可以安全地从 effect 依赖和 memo 比较中省略或稳定传递。
从事件闭包解释 React 状态快照,用一次点击与延时日志区分当前函数里的值和下一次界面状态,并说明快照何时正好符合业务需要。
围绕“为什么 React 的不可变更新习惯与 React.memo、useMemo 的浅比较是配套的”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明浅比较依赖「引用变则数据变」的约定,结构共享让未变部分保持引用从而跳过渲染,原地修改会破坏这一约定。
围绕“设计 React 组件的 state 结构时应遵循哪些原则”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖完整回答要覆盖合并关联 state、消除冗余与矛盾、避免过深嵌套这几条并各给一句判断依据。
用四步混合更新推导 React 的替换与 updater 队列,说明闭包值在入队前已经计算、后续替换覆盖中间结果,以及 updater 必须保持纯函数。
围绕“什么情况下应该用 React 的 useReducer 替代 useState”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须给出更新逻辑复杂、多个事件产生同类修改、下一状态依赖前状态且跨组件传递 dispatch 更省事的判断标准。