Store 类 API
hopstate 的核心为 Store 类,提供了状态更新、订阅和 dispatch 等功能。
构造函数
constructor(
initialState: S,
actions?: ActionsType<S>,
reducer?: (state: S, action: any) => S
)
- initialState:初始状态数据。
- actions:包含 action 函数对象,每个 action 的第一个参数自动绑定当前 store 实例。
- reducer:(可选)当希望使用 dispatch 进行 reducer 风格的状态更新时,可以传入该函数。
方法
getState()
获取当前状态对象。
getState(): S;
setState()
重载方法:
- 更新整个 state: setState(newState | updater)
- 针对深层路径更新部分 state: setState(path, newValue | updater)
// 更新整个 state
store.setState(prev => ({ ...prev, count: prev.count + 1 }));
// 更新深层路径
store.setState("user.info", prev => ({ ...prev, name: 'Bob' }));
subscribe(callback)
订阅整个 state 的变化,回调会在状态更新时触发。
subscribe(callback: (state: S) => void): () => void;
subscribeSelector(selector, callback, isEqual?)
订阅 state 中指定分支的变化。
- selector:可以为字符串路径或函数,获取 state 分支的值。
- callback:当订阅的值变化后触发。
- isEqual:自定义比较函数,默认使用严格相等。
subscribeSelector<T>(
selector: string | ((state: S) => T),
callback: (newValue: T, oldValue: T) => void,
isEqual?: (a: T, b: T) => boolean
): () => void;
useStore(selector?, isEqual?)
React Hook 接口,在组件中使用,返回根据 selector 获取的 state 分支,当分支内容变化时组件自动重渲染。
useStore<T = S>(
selector?: string | ((state: S) => T),
isEqual?: (a: T, b: T) => boolean
): T;
dispatch(action)
支持两种 dispatch 方式:
- 如果 action 为函数,则视为 thunk,执行函数逻辑;
- 如果传入 reducer,则根据 reducer 更新 state;
- 未传入 reducer时,直接更新会提示警告。
dispatch(action: any): any;
addMiddleware(middleware)
注册 middleware,并重建 dispatch 链。
addMiddleware(middleware: Middleware<S>): void;
middleware 的签名为:
({ getState, dispatch }) => (next: Dispatch) => (action: any) => any