标准答案

  1. 用一个 store 保存内部 state。
  2. 提供 getState 读取当前状态。
  3. 提供 setState 或 dispatch 作为唯一更新入口。
  4. 提供 subscribe 注册监听函数,并返回 unsubscribe 取消订阅。
  5. 复杂版本再加入 action、reducer、中间件、派生状态、持久化和模块拆分。

题目解析

状态管理库解决的不是“把变量放到全局”这么简单,而是让跨组件共享状态有明确读取、更新和通知机制。否则状态来源会分散,谁改了数据、为什么更新都很难追踪。

最小模型可以像 Redux store:getState 读,dispatch 改,subscribe 听。也可以像轻量 store:setState 合并局部状态后通知监听器。

真实项目里还要区分哪些状态应该进全局。服务端缓存、表单临时输入、URL 参数、组件局部 UI 状态都不一定适合放到同一个全局 store。

代码示例

简化版 store 展示读取、更新、订阅和取消订阅四个能力。

JavaScript
function createStore(initialState) {
  let state = initialState
  const listeners = new Set()

  return {
    getState() {
      return state
    },
    setState(partial) {
      state = { ...state, ...partial }
      listeners.forEach((listener) => listener(state))
    },
    subscribe(listener) {
      listeners.add(listener)
      return () => listeners.delete(listener)
    }
  }
}

常见误区

  • 把所有页面状态都塞进全局 store,导致状态边界失控。
  • 允许任意地方直接改内部 state,订阅者无法可靠收到通知。
  • 没有 unsubscribe,组件卸载后仍然持有监听函数,造成内存泄漏。

作者信息