标准答案

  1. 先判断状态是否真的需要全局共享。组件内部状态、表单草稿和一次性弹窗状态通常不需要放全局。
  2. 按业务领域拆 store 或模块,例如 user、permission、cart、settings,而不是做一个巨大 global store。
  3. 状态更新入口要收敛到明确 action,避免组件随意改全局对象导致数据流不可追踪。
  4. 服务端数据要考虑缓存、失效、刷新和请求状态,很多场景更适合交给专门的数据请求层。
  5. 持久化状态要控制范围和版本迁移,敏感数据不要直接存 localStorage。

题目解析

这道题考的是状态分层。全局状态不是越多越好,放错位置会让依赖关系、调试和性能都变差。

设计时可以从生命周期、共享范围、是否可持久化、是否来自服务端这四个维度判断。

通用状态模块还要关注选择器、订阅粒度、重置流程、权限变化和退出登录后的清理。

代码示例

一个清晰的状态模块会把状态和更新动作放在同一领域边界内。

JavaScript
const userStore = {
  state: {
    profile: null,
    permissions: []
  },
  setProfile(profile) {
    this.state.profile = profile
  },
  reset() {
    this.state.profile = null
    this.state.permissions = []
  }
}

常见误区

  • 把所有接口返回、表单输入和弹窗状态都塞进全局 store。
  • 组件直接修改全局状态对象,缺少可追踪的更新入口。
  • 退出登录或切换租户时没有清理全局状态,导致数据串号。

作者信息