Hooks 与 RSC

共 52 题
#

1. useContext 的 Provider 拆分与 re-render 性能治理

A memo 包裹的组件不会因 context 值变化而重渲染
B React Compiler 可以自动解决 context 广播问题
C 拆分 Provider 越多越好,没有成本
D context 值变化会重渲染所有直接消费者,应按变化频率拆分 Provider 并用 useMemo 稳定 value ✓ 正确答案
#

2. use() Hook 在条件中调用不等于完全放开 Hook 规则的边界

A use() 可在条件中调用,意味着所有 Hooks 都可以条件调用
B use() 在条件中调用会导致状态错乱
C useState 也可以随意放在条件分支中
D 仅 use() 不受调用顺序约束,其它 Hooks 仍须顶层固定顺序调用 ✓ 正确答案
#

3. useId、useSyncExternalStore、useInsertionEffect 的场景

A useId 生成稳定 ID、useSyncExternalStore 订阅外部源、useInsertionEffect 在 DOM 变更前注入样式,三者场景各异 ✓ 正确答案
B useInsertionEffect 用于读取 DOM 布局
C useId 适合直接作为列表 key
D useSyncExternalStore 的 getSnapshot 每次返回新对象
#

4. useImperativeHandle 与 forwardRef(现代 ref-as-prop)

A React 19 中函数组件仍需 forwardRef 才能接收 ref
B React 19 中 ref 可作普通 prop 传递,useImperativeHandle 用于定制暴露的命令式 API ✓ 正确答案
C useImperativeHandle 会暴露整个 DOM 节点给父组件
D ref-as-prop 下 ref 可以通过 ...props 展开而不会丢失
#

5. useId SSR 一致性 ID 的工程价值

A useId 基于树位置编码生成,SSR 与水合时同一组件必然得到相同 ID ✓ 正确答案
B useId 基于随机数生成,SSR 与客户端可能不一致
C useId 生成的 ID 适合持久化存储
D useId 生成的值可以作为列表 key
#

6. useDebugValue 在自定义 Hooks 调试的应用

A useDebugValue 会影响生产环境的渲染性能
B useDebugValue 在 DevTools 中显示自定义 Hook 的调试标签,formatter 可延迟昂贵的格式化 ✓ 正确答案
C useDebugValue 可以在组件内部任意位置调用
D useDebugValue 用于修改 Hook 的返回值
#

7. useActionState/useFormStatus/useOptimistic 在表单场景的应用

A useFormStatus 可以读取任意表单的 pending 状态
B useActionState 的返回值只能是字符串
C useOptimistic 的乐观值在提交失败后需要手动还原
D useActionState 管理提交结果、useFormStatus 在子组件读 pending、useOptimistic 展示乐观中间态,三者分工协作 ✓ 正确答案
#

8. useInsertionEffect 在性能预算与首屏渲染的工程价值

A useInsertionEffect 在 DOM 变更前同步注入样式,避免 FOUC,专用于 CSS-in-JS 库 ✓ 正确答案
B useInsertionEffect 在浏览器绘制后执行
C useInsertionEffect 可以安全地读取 DOM 布局
D useInsertionEffect 在 SSR 中同样执行
#

9. eslint-plugin-react-hooks 与 React Compiler 对依赖数组的静态检查协作,自动化与手动标注的边界

A React Compiler 开启后 exhaustive-deps 规则完全没有存在必要
B eslint-plugin-react-hooks 只能检查 useEffect
C 依赖数组可以随意省略,Compiler 会全部自动补全
D lint 插件检查 Hook 规则与依赖完整性,Compiler 自动记忆化并推断依赖,无法证明的代码需手动标注兜底 ✓ 正确答案
#

10. useEffectEvent(React 19.2)与 ref 化回调方案的对比,稳定引用与依赖收集的工程取舍

A useEffectEvent 提供 Effect 内可调用、总读最新值且不进依赖的稳定回调,比手工 ref 化方案更语义化 ✓ 正确答案
B useEffectEvent 返回的回调是响应式的,每次渲染都变化
C useEffectEvent 可以在事件处理器中调用
D ref 化回调方案可以完全替代 useEffectEvent 且没有缺点
#

11. useFormStatus(React 19)在父组件读取表单状态的工程价值

A useFormStatus 可以读取任意父组件的 state
B useFormStatus 返回的是表单的输入值
C useFormStatus 让表单内部子组件直接读取最近 form 的 action pending 状态,免去 props 逐层传递 ✓ 正确答案
D useFormStatus 只能在服务端渲染中使用
#

12. use server/use client(React Server Functions)

A use server 模块中的函数可以在客户端直接访问文件系统
B use server 标记服务端函数,参数与返回值经 Flight 序列化、以 action ID 跨网络调用,只支持可序列化数据 ✓ 正确答案
C Server Function 可以接收任意 JS 对象包括函数闭包
D use client 模块中的代码不会打包进客户端 bundle
#

13. React Server Components(RSC)

A RSC 在服务端执行并输出 Flight Payload,不进客户端包,数据获取前移可减少 bundle 与瀑布流 ✓ 正确答案
B Server Components 会被打包进客户端 bundle 用于水合
C Server Components 可以使用 useState 管理交互状态
D 客户端组件可以直接 import 服务端组件
#

14. RSC 在 Next.js 16(默认 Turbopack)

A Next.js 16 中 Turbopack 不支持 RSC 边界识别
B 修改 Server Components 会触发客户端整页热重载
C Next.js 16 默认使用 webpack 打包
D Turbopack 原生理解 use client/use server 边界并自动分割模块图,服务端依赖不会进入客户端 bundle ✓ 正确答案
#

15. RSC 边界跨越与 "use client"/"use server" 的混合使用

A Client Components 可以直接 import Server Components
B 跨边界可以传递任意 JS 对象
C 服务端组件可把渲染好的子树作为 children 插槽传给客户端组件,跨边界 props 必须可序列化 ✓ 正确答案
D use server 只能用于整个文件,不能标记单个函数
#

16. React 19 的 use()、Actions 与 form 状态管理与老版本 Hooks 的差异?

A use() 与 Actions 体系减少 loading 样板代码,useActionState 替代了 useReducer+submit 的常见组合 ✓ 正确答案
B use() 可以完全替代 useEffect 的所有职责
C useActionState 与老版 useReducer 的职责完全相同
D form action 提交后表单不会自动重置
#

17. 自定义 Hooks 的设计原则,返回稳定引用、状态隔离、SSR 安全

A 自定义 Hook 可以安全地在渲染期访问 window 对象
B 自定义 Hook 内部可以使用共享的可变对象而不影响多实例
C 自定义 Hook 应返回稳定引用、保证每次调用状态独立,并延迟浏览器 API 访问到 effect 中保证 SSR 安全 ✓ 正确答案
D 自定义 Hook 不需要以 use 开头
#

18. useRef 的两阶段更新(mutation 不触发 render)与 useState 的边界

A ref mutation 立即生效但不触发渲染,UI 需要跟随值变化时应使用 useState ✓ 正确答案
B 修改 ref.current 会触发组件重新渲染
C useRef 的初始值每次渲染都会重新创建
D 渲染期间读写 ref.current 是安全的推荐做法
#

19. useEffect 的执行时机(commit 后)与 useLayoutEffect 在 DOM 测量场景的差异

A useEffect 在浏览器绘制之前同步执行
B useLayoutEffect 在服务端渲染时正常执行
C useEffect 与 useLayoutEffect 的执行时机完全相同
D useLayoutEffect 在 DOM 更新后、绘制前同步执行,适合 DOM 测量,useEffect 绘制后异步执行 ✓ 正确答案
#

20. useMemo/useCallback 与 React Compiler 自动 memoization 的关系

A Compiler 自动生成与 useMemo/useCallback 等价的记忆化,无法证明安全的代码 bailout 后仍需手工优化 ✓ 正确答案
B React Compiler 会移除 useMemo/useCallback 的语义
C 开启 Compiler 后所有手工 memo 都必须删除
D Compiler 只优化 Class 组件
#

21. useEffect 的依赖数组与清理函数机制

A 依赖变化时先执行新的 effect 再清理旧的
B 依赖数组逐项 Object.is 比较,变化时先执行上次清理再运行新 effect,闭包引用的响应式值必须全部列入 ✓ 正确答案
C 省略依赖数组表示只在挂载时执行一次
D 内联对象作为依赖不会导致 effect 重跑
#

22. Hooks 规则与闭包陷阱(Stale Closure)的成因与修复

A Hooks 可以在条件分支中调用,React 会自动处理
B Stale Closure 是闭包捕获旧渲染值的现象,可通过补全依赖、函数式更新或 ref 镜像修复 ✓ 正确答案
C useCallback 缓存函数后闭包永远是最新的
D Hooks 的调用顺序可以随意变化
#

23. useTransition 在性能预算与首屏渲染的工程价值

A Transition 把非关键更新移出紧急路径,保障输入响应预算,首屏关键内容仍应走紧急更新 ✓ 正确答案
B useTransition 能减少后台更新的总工作量
C 首屏的 LCP 内容应该包进 Transition 渲染
D Transition 更新永远不会执行完成
#

24. useEffect 的替代心智模型(You Might Not Need an Effect),渲染期计算、事件处理与 key 重置的工程取舍

A 所有数据派生都应该用 useEffect + setState 实现
B key 重置只影响单个组件不影响子树
C effect 是处理用户事件的首选方式
D 渲染期可计算的派生数据直接渲染或用 useMemo,用户操作放事件处理器,重置状态用 key 变化 ✓ 正确答案
#

25. React 19 Hooks 的依赖数组(deps)

A 依赖数组使用深比较判断变化
B 依赖数组逐项 Object.is 比较,须包含闭包引用的所有响应式值,稳定引用不必列入 ✓ 正确答案
C 依赖数组可以随便写,不影响 effect 执行
D useRef.current 每次渲染变化,必须加入依赖
#

26. React 19 的 useEffect 在副作用清理(cleanup)的工程应用

A cleanup 在依赖变化重跑前与卸载时执行,应对称销毁资源并保证幂等,StrictMode 双调用可暴露非幂等清理 ✓ 正确答案
B cleanup 只在组件卸载时执行
C cleanup 里可以做任何 UI 重置
D 卸载后 setState 没有任何副作用可以忽略
#

27. React 19 的 useState 的函数式更新(setX(prev => prev + 1))的工程取舍

A setX(x + 1) 与 setX(prev => prev + 1) 在任何场景下等价
B 异步回调中只能使用直接传值
C 函数式更新的回调中可以执行任意副作用
D 函数式更新按队列顺序基于最新 state 计算,批处理下多次增量更新更安全 ✓ 正确答案
#

28. React 19 的 useReducer 在复杂状态机与表单管理的工程应用

A useReducer 适合多字段联动与状态机,提交类场景 React 19 优先 useActionState,reducer 必须纯净 ✓ 正确答案
B useReducer 与 useState 完全等价,可随意替换
C reducer 中可以直接修改原 state 对象
D useReducer 不能管理表单状态
#

29. React 19 的 useLayoutEffect 在 DOM 测量与同步副作用的工程应用

A useLayoutEffect 在浏览器绘制之后执行
B useLayoutEffect 可以替代 useEffect 处理所有副作用
C useLayoutEffect 在绘制前同步测量与修正 DOM,避免闪烁,但会阻塞绘制且 SSR 不执行 ✓ 正确答案
D useLayoutEffect 在服务端渲染中正常执行
#

30. React 19 的 Hooks 规则(顶层调用、不在条件中)

A Hooks 的调用顺序可以变化,React 会自动重新对应
B Hook 状态按调用顺序存入链表,条件调用会破坏对应导致状态错位,React 19 中 use() 是例外 ✓ 正确答案
C 条件渲染组件时可以直接在 if 中调用 useState
D lint 无法检测 Hook 规则违反
#

31. React 19 的并发特性(Concurrent Features)

A createRoot、Transition、useDeferredValue、Suspense、use() 等共同构成并发特性,输入保持紧急、派生工作降级 ✓ 正确答案
B 并发特性只包括 useTransition 一个 API
C 并发特性会改变渲染结果的正确性
D flushSync 会把更新降级为低优先级
#

32. React 19 的 useActionState 在 Server Actions 的工程协作

A Server Action 抛出的错误会自动变成 useActionState 的 state
B 无 JS 时 form action 完全失效
C useActionState 只能用于客户端本地函数
D useActionState 包装 Server Action,返回值驱动状态、isPending 覆盖提交期间,错误应返回结构化结果 ✓ 正确答案
#

33. React 19 的自定义 Hook 单元测试(renderHook from RTL)的工程实践

A renderHook 返回 result/rerender/unmount,配合 act/waitFor 断言返回值与副作用,wrapper 提供 context ✓ 正确答案
B renderHook 只能测试没有状态的自定义 Hook
C renderHook 直接渲染真实 DOM 供断言
D renderHook 不能测试有副作用的 Hook
#

34. React 19 的 Hooks 在 Strict Mode 下双调用的工程意义与边界

A StrictMode 在生产构建中也会双调用
B StrictMode 开发环境双调用渲染与 effect 挂载清理,用于暴露非纯渲染与泄漏,生产构建不生效 ✓ 正确答案
C 双调用会改变最终渲染结果
D StrictMode 双调用是并发模式的产物,不能关闭
#

35. React 19 的 useContext 在跨组件状态共享的性能代价

A context 值变化时只有直接子组件重渲染
B context 广播式更新会让所有消费者重渲染,value 未 useMemo 时 Provider 每次渲染都会波及消费者 ✓ 正确答案
C memo 可以完全阻止 context 消费者的重渲染
D React Compiler 会自动优化 context 广播问题
#

36. React 19 的 useRef 在命令式 DOM 访问与缓存值的工程应用

A useRef 用于命令式 DOM 操作与缓存不参与渲染的稳定值,渲染期读写应避免 ✓ 正确答案
B 修改 ref.current 会触发组件渲染
C ref 缓存适合所有派生数据
D React 19 中 ref 必须通过 forwardRef 传递
#

37. React 19 的 useMemo 在依赖稳定性与缓存命中率的工程取舍

A useMemo 的依赖是每次渲染的新引用时缓存命中率依然很高
B useMemo 的依赖比较是深比较
C 所有计算都应该用 useMemo 包裹
D useMemo 的缓存命中率取决于依赖引用稳定性,应治理稳定引用并保持最小依赖 ✓ 正确答案
#

38. Server Components 在大型 Next.js 应用的代码分割价值

A Server Components 的代码会打包进客户端 bundle
B RSC 让服务端代码不进客户端包,客户端代码按边界分割懒加载,客户端体积只随交互表面积增长 ✓ 正确答案
C 客户端组件可以直接 import 服务端工具库
D RSC 对大型应用的 bundle 体积没有影响
#

39. Server Actions 的安全考量(CSRF、Origin 验证、idempotency)

A Server Action 只接受 POST 就能完全防御 CSRF
B SameSite=Lax 可以解决所有安全问题
C 需校验 Origin/Host、设置 SameSite Cookie 并配合幂等键去重,POST 不自动免疫 CSRF ✓ 正确答案
D Server Actions 不需要幂等性设计
#

40. 服务端缓存管理(cache/use cache)的 revalidation 策略

A cache() 的缓存跨请求共享
B 强一致数据也应使用长缓存
C use cache 的缓存永远不过期
D 时间型 revalidate 适合延迟可接受的静态数据,事件型(tag/path)revalidate 适合写操作后的精准失效,两者可组合 ✓ 正确答案
#

41. React 19 的资源预加载 API(prefetchDNS/preconnect/preload/preinit)

A prefetchDNS 会下载资源内容
B 预加载 API 只能用于客户端组件
C preload 适用于所有资源,越多越好
D prefetchDNS 只解析 DNS、preconnect 建立连接、preload 下载关键资源、preinit 立即初始化,用于缩短关键路径 ✓ 正确答案
#

42. RSC 数据预取 cache()/fetch(...{cache:force-cache}) 的边界条件

A cache() 的缓存跨请求跨用户共享
B cache() 只在请求作用域内去重,force-cache 跨请求缓存,用户个性化数据需按用户键隔离 ✓ 正确答案
C force-cache 的缓存会自动过期
D 所有 fetch 都应该加 cache: 'force-cache'
#

43. RSC 与 Client Component 交互,serializable props 边界与传递非可序列化对象的工程价值

A 跨边界 props 必须可 Flight 序列化,class 实例与函数会被丢弃,应设计为可序列化 DTO ✓ 正确答案
B RSC 可以把任意 JS 对象作为 props 传给 Client Components
C 函数可以作为 props 直接跨边界传递
D Promise 不能跨边界传递
#

44. RSC 与 Suspense 在数据流边界的协作

A RSC 必须等所有数据就绪才能发送任何内容
B 流式传输只在客户端组件中生效
C Suspense 边界把 RSC 数据流切成独立单元,先发外壳再流式补发增量,客户端渐进呈现 ✓ 正确答案
D 边界越细越多越好
#

45. React Compiler 自动记忆化的原理与手动 memo/useMemo 的边界?

A React Compiler 通过运行时代码生成实现记忆化
B Compiler 编译期分析响应式依赖并自动生成等价 memo/useMemo/useCallback,无法证明安全的代码 bailout 后手工兜底 ✓ 正确答案
C Compiler 会删除所有手工 memo 导致语义变化
D Compiler 只优化 SSR 组件
#

46. React 19 的 useFormStatus/useFormState 在表单交互的工程价值

A useFormStatus 返回的是表单的输入值
B useFormStatus 管提交过程反馈(pending),useFormState/useActionState 管提交结果回显,配合实现自动禁用与错误展示 ✓ 正确答案
C 两者功能完全重复可以互换
D useFormStatus 可以读取任意表单的状态
#

47. Next.js 的 RSC Payload 因重复数据和过深 Client Boundary 持续增大时,如何定位 Flight 响应中的主要贡献者,并结合 use cache、cache tag 与 revalidation 控制传输体积和数据新鲜度

A RSC Payload 体积只取决于组件数量
B 边界越深 Flight 体积越小
C 用 Network/DevTools 定位 Flight 贡献者,cache() 与 use cache 去重降体积,tag/path revalidate 控制新鲜度 ✓ 正确答案
D revalidateTag 只能全站刷新
#

48. RSC 向 Client Component 传参时,React Flight 可处理的 Date、Map 与普通 JSON 有何差异,为什么带原型和方法的 class instance 不能直接跨边界

A Flight 可以把 class 实例的完整原型链传给客户端
B 普通 JSON 在 Flight 中携带类型信息
C Flight 对 Date/Map/Promise 做类型标记与重建,class instance 的原型与方法不可序列化,需用 DTO + 客户端重建 ✓ 正确答案
D 跨边界传递 class 实例是推荐做法
#

49. Server Action 仅接受 POST 仍不能自动消除 CSRF;在反向代理、多自定义域和预览环境下,应如何校验 Origin/Host、SameSite Cookie、CSRF token 与 Fetch Metadata,并处理缺失 Origin 的合法请求

A Server Action 只接受 POST 就能免疫 CSRF
B 缺失 Origin 的请求可以一律放行
C 跨站表单可伪造 POST 且 Cookie 自动携带,需 Origin/Host 校验、SameSite、token 与 Fetch Metadata 多层防护 ✓ 正确答案
D SameSite=Strict 能解决全部安全问题
#

50. 恶意 Flight 负载、伪造 Server Function 调用和资源耗尽分别可能从哪里进入

A Server Action 端点是内部接口,不需要防护
B 限流只防 DDoS,防不了伪造调用
C 客户端提交的数据可以完全信任
D 恶意 Flight 负载、伪造 action 调用与资源耗尽分别从解析器、暴露端点与并发/体积进入,需解析校验、鉴权与限流 ✓ 正确答案
#

51. 把 "use client" 从应用布局根节点下移到交互叶子后,如何通过构建 manifest、Flight 响应和浏览器 coverage 对比客户端 JS、共享 chunk 与水合时间,并防止服务端依赖被意外拉入客户端包

A 边界下移后客户端 bundle 体积会增大
B 服务端依赖被打入客户端包不会报错也无法预防
C "use client" 下移不影响水合时间
D 用构建 manifest、Flight 响应与 Coverage 对比边界下移收益,并靠构建审计与依赖 lint 防服务端依赖泄漏 ✓ 正确答案
#

52. RSC 与 Client Component 的序列化边界,哪些值不能跨边界传递?

A 所有 JS 值都可以跨 RSC 边界传递
B 函数、class 实例、Symbol、循环引用等不可跨边界传递,应传可序列化 DTO 或标识 ✓ 正确答案
C 跨边界传函数是 React 19 的推荐做法
D 非序列化 props 在生产环境会抛出致命错误