本地与共享状态

共 23 题
#

1. useReducer + Context 在中型状态管理的边界(与 Redux 的取舍)

A Redux 在新版 React 中已完全被 useReducer+Context 取代
B Context 的 value 变化会通知所有消费组件,缺乏细粒度订阅 ✓ 正确答案
C useReducer+Context 提供完善的 DevTools 时间旅行功能
D Context 适合高频更新的全局状态
#

2. Nanostores 的 @nanostores/react 与跨框架互操作

A Nanostores 的 store 依赖 React 才能工作
B Nanostores 无法在 Vue 中复用
C Nanostores 依赖 Proxy 实现响应式
D useStore 会在组件卸载时自动取消订阅 ✓ 正确答案
#

3. Context API + useSyncExternalStore 在轻量全局状态的工程价值

A 它通过 getSnapshot 与 subscribe 实现外部 store 的安全订阅,避免 tearing ✓ 正确答案
B 它会在每次渲染时强制重新订阅
C 它无法与并发渲染兼容
D 它只用于 React 内部状态,不能订阅外部 store
#

4. Zustand 与 Jotai 在原子状态(atomic state)

A 两者都需要手动实现 selector 引用稳定
B Zustand 使用原子状态模型,Jotai 使用集中式 store
C Jotai 通过原子组合与依赖追踪自动实现细粒度订阅 ✓ 正确答案
D Zustand 无法做 selector 订阅
#

5. Jotai 的 atomFamily 与 atomWithStorage 在动态键与持久化的应用

A atomFamily 会为不同参数返回同一个原子
B atomWithStorage 自动将原子状态持久化到 storage ✓ 正确答案
C atomFamily 无法用于持久化
D atomWithStorage 返回的是普通对象而非原子
#

6. Zustand 的 subscribeWithSelector 与 useShallow 在 selector 引用稳定性的工程价值

A 它对 selector 返回值做深比较判断是否变化
B 它只能用于单个字段的 selector
C 它会让 store 无法订阅
D 它通过浅比较避免因新对象引用而导致的重复渲染 ✓ 正确答案
#

7. Jotai 的原子化状态与依赖追踪

A 组件通过依赖图自动订阅受影响的 atom,实现最小化更新 ✓ 正确答案
B Jotai 不支持异步 atom
C 依赖追踪需要手动声明每个订阅关系
D derived atom 每次渲染都重新计算,不做缓存
#

8. Zustand 的轻量与 selector 订阅

A selector 返回对象时必然导致重渲染
B Zustand 需要 Provider 包裹才能使用
C Zustand 依赖 Context 实现状态共享
D selector 只用 Object.is 比较结果,变化时才触发重渲染 ✓ 正确答案
#

9. useState/useReducer 与外部状态管理库的边界

A 状态提升是解决跨组件共享的中间手段,能解决时无需引入外部库 ✓ 正确答案
B 所有跨组件共享的状态都应立刻使用外部状态库
C useState 无法在组件内使用
D 外部状态库比 useState 性能一定更好
#

10. TanStack Query 的 staleTime/gcTime 与 React 19 use()/Server Functions 的协作

A staleTime 控制内存回收,gcTime 控制过期时间
B staleTime 控制数据多久后视为过期,gcTime 控制缓存多久后回收 ✓ 正确答案
C 两者作用完全相同
D gcTime 默认是 0 毫秒
#

11. Zustand 的 slice 与持久化 与 SSR/RSC 边界的协作

A persist 中间件在服务端也会读写 localStorage
B slice 模式会破坏类型推导
C 模块级 store 单例在 SSR 中可能被多个请求共享导致串数据 ✓ 正确答案
D SSR 下无需处理 store 单例问题
#

12. Valtio 的 proxy/snapshot/subscribe 双向同步在表单与撤销重做的应用

A proxy 状态不可直接修改
B useSnapshot 返回一个可变的 proxy 对象
C Valtio 无法做撤销重做
D 写操作通过 proxy 完成,读操作通过快照完成,实现双向同步 ✓ 正确答案
#

13. Nanostores 的极小体积与框架无关

A 它依赖 React 才能运行
B 它内置了完整的 DevTools 支持
C 核心体积约 1KB,且不依赖任何框架,可跨框架共享 ✓ 正确答案
D 它必须搭配特定框架使用
#

14. Valtio 的 Proxy 响应式模式

A 写操作会返回不可变快照
B Proxy 在 get 时收集依赖、set 时触发通知,useSnapshot 实现细粒度订阅 ✓ 正确答案
C 需要手动声明每个组件的依赖
D Proxy 无法深层次代理对象
#

15. Redux Toolkit 在测试与可维护性的工程价值

A reducer 是纯函数,输入 state 与 action 输出新 state,易于单元测试 ✓ 正确答案
B createAsyncThunk 使异步流程无法测试
C RTK 增加了大量样板代码
D createSlice 无法组织 action 类型
#

16. TanStack Query v5 与 URL 状态/路由器的协作

A queryKey 与 URL 参数完全无关
B URL 参数应作为 queryKey 的一部分,使 URL 变化映射到对应缓存 ✓ 正确答案
C 路由切换无法触发数据获取
D v5 不支持 queryKey 字符串化
#

17. Recoil(已停止维护)历史方案与 Jotai 演进的取舍

A Recoil 至今仍在活跃维护
B Jotai 继承了 Recoil 的原子化思想并更轻量、维护活跃 ✓ 正确答案
C Recoil 的 atom 概念无法迁移到 Jotai
D Jotai 完全复制了 Recoil 的实现
#

18. useRef/useImperativeHandle 在命令式 API(动画控制器)

A 它让父组件通过 ref 调用子组件暴露的命令式方法 ✓ 正确答案
B 它替代了 useState 的所有功能
C 它用于声明式地传递状态
D 它只能在类组件中使用
#

19. Signals 提案的细粒度响应式(alien-signals、@preact/signals)

A Signal 变化会触发整棵树重新渲染
B Signals 只能用于 Preact
C Signal 是不可变的值
D Signal 读取时追踪依赖,写入时只通知订阅者 ✓ 正确答案
#

20. Signals 提案与 use-signals 的标准化进程

A 标准化已完全结束
B Signals 提案已正式成为 ECMAScript 标准
C use-signals 是 React 官方内置的信号支持
D TC39 正在推进 Signals 提案标准化,use-signals 是把信号接入 React 的适配库 ✓ 正确答案
#

21. Recoil 停止维护后,atom/selector 模式向 Jotai 迁移的等价实现与踩坑

A 两者 API 完全一致,无需调整
B Jotai 不支持 derived atom
C Recoil 的 selectorFamily 对应 Jotai 的 atomFamily ✓ 正确答案
D Recoil 的 atom 无法映射到 Jotai
#

22. Apollo Client 的 normalized cache(typePolicies 与 field policies)在本地状态与远端数据协作的工程取舍

A 所有查询结果都做深拷贝,不做归一化
B field policies 只能读不能写
C normalized cache 无法配合本地状态
D 查询结果按类型+id 归一化存储,typePolicies 定义缓存键 ✓ 正确答案
#

23. TanStack Query 的 queryKey 与缓存失效 在大型表单与复杂状态的协作

A queryKey 是缓存标识,可按前缀匹配进行精确失效 ✓ 正确答案
B invalidateQueries 只能失效全部缓存
C 表单提交后无需刷新缓存
D queryKey 无法包含对象