React 18 中 Suspense 在服务端渲染时的行为与纯客户端渲染有什么不同?
围绕“React 18 中 Suspense 在服务端渲染时的行为与纯客户端渲染有什么不同”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明服务端先发 fallback、就绪后再流式补发真实内容,而客户端 Suspense 只在挂载后切换。
程序员面试题库第 74 页,收录第 3651–3700 题,共 5000 道完整解析,覆盖前端、JavaScript、React、Vue、Node.js、AI Agent、网络、数据库与系统设计。
按稳定语义路径排序
围绕“React 18 中 Suspense 在服务端渲染时的行为与纯客户端渲染有什么不同”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明服务端先发 fallback、就绪后再流式补发真实内容,而客户端 Suspense 只在挂载后切换。
围绕“当 React 首屏内容依赖客户端才有的信息(如本地存储、媒体查询)时,如何避免 hydration 不匹配”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须给出挂载后再二次渲染(mounted 状态)这一模式及其首屏闪烁的取舍。
围绕“React Server Components 中 'use client' 指令标记的是组件还是模块边界,它的真实”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明它声明的是服务端与客户端模块图的边界、被导入的下游模块都算客户端代码。
围绕“React 的 useActionState 如何配合 Server Action 管理表单提交的 pending ”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明它把 action 的返回值与提交中状态接入组件渲染。
围绕“为什么在 React SSR 应用中生成可访问性 id 要用 useId 而不是自增计数器或随机数”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释 useId 在服务端与客户端生成一致且多根/流式场景不冲突的机制。
解释服务端 HTML 不包含 React 函数闭包和客户端状态,说明 hydration 如何复用已有 DOM 并接管后续更新,同时区分原生链接、表单与 React 事件,以及直接重建 DOM 的代价。
围绕“在 React 中如何不修改原数组地向数组中间插入一个元素或删除指定下标的元素”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须给出用 slice 拼接或 filter 完成插入与删除的具体写法及为何不能用 splice。
围绕“在 React 中如何不可变地更新数组里某一个对象元素的字段”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须给出用 map 遍历、仅对目标元素返回新对象、其余元素保持原引用的写法,以及保持未变元素引用对 memo 的意义。
围绕“更新 React 数组 state 时,push、splice、sort 与 map、filter、slice 的可”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答要按「修改原数组/返回新数组」划分两组方法并给出各操作的正确替代。
围绕“React 事件处理器中 await 之后再读取 state 拿到的是旧值,如何拿到最新状态”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须诊断出异步代码捕获的是发起时那次渲染的快照,并给出函数式更新或 ref 镜像最新值两种修复的取舍。
通过 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 更省事的判断标准。
围绕“Redis 的 APPEND 和 GETRANGE 能实现什么字符串操作,有什么实际用途”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明追加与按区间读取的能力及日志式追加场景。
围绕“给 Redis Key 设了过期时间,为什么到期后立刻 GET 偶尔还能拿到或内存没立刻降”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明惰性删除与定期删除导致删除时机不保证精确。
围绕“Redis 对已设过期时间的 Key 再次 SET 或 EXPIRE,过期时间会怎么处理”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确 SET 覆盖会清除原 TTL 而再次 EXPIRE 是替换式刷新。
围绕“Redis 的 EXPIRE 和 EXPIREAT 分别适合什么过期语义场景”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须区分相对存活时长与绝对时间点,例如会话续期与整点失效。
围绕“Redis 的 GETSET 命令适合什么场景,和先 GET 再 SET 有什么区别”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 GETSET 原子返回旧值并写入新值、避免竞态。
围绕“Redis 哈希能只给某个字段设过期时间吗,需要什么版本或替代方案”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 Redis 7.4 前只能整 Key 过期、7.4 起有 HEXPIRE,或改用多个字符串 Key。
围绕“Redis 哈希底层什么情况下用 listpack,什么时候转成 hashtable”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须给出字段数与单字段长度阈值触发转换且转换不可逆。
围绕“Redis 哈希字段数到几十万后,HGETALL 和单字段操作的开销有什么变化”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明编码转换后单字段仍 O(1) 但 HGETALL 是 O(N) 阻塞风险,应改 HSCAN。
围绕“大量小对象用 Redis 哈希聚合存比每个对象一个字符串 Key 省内存吗,为什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释小哈希走紧凑编码省去每 Key 元数据开销。