createStore
创建响应式 store,自动类型推断,内置 Immer 支持
API 参考
语法
const store = createStore(initialState);
参数
initialState
: 定义 store 初始状态和操作的对象
返回值
响应式 store 实例,包含:
value
: 当前状态(读/写访问,带依赖跟踪)setState(updater, options?)
: 使用 Immer 支持更新状态subscribe(options)
: 细粒度订阅控制
示例
简单状态管理
import { createStore, useStoreValue } from "zenbox";
// 类型自动推断
const counterStore = createStore({ count: 0 });
// 通过 store.value 直接访问状态值
console.log("当前计数:", counterStore.value.count);
function Counter() {
// 组件响应式订阅 store 状态变化,自动重新渲染
const { count } = useStoreValue(counterStore);
const increment = () => {
counterStore.setState((state) => {
state.count++; // 使用 Immer 风格更新状态
});
};
return (
<div>
<p>计数: {count}</p>
<button onClick={increment}>+</button>
</div>
);
}
带操作的 Store
将状态和更新逻辑放在一起,代码更清晰可维护:
const userStore = createStore({
// 状态
name: "Del Wang",
blog: "https://del.wang",
followers: 0,
// 方法
follow() {
userStore.setState((state) => {
state.followers++;
});
},
// 异步操作
async fetchProfile() {
const response = await fetch("https://api.github.com/users/del-wang");
const data = await response.json();
userStore.setState(data);
},
});
// 直接通过 store.value 调用方法
userStore.value.follow();
await userStore.value.fetchProfile();
更新模式
1. Immer 风格更新(推荐)
适合复杂变更和嵌套状态:
store.setState((state) => {
state.count += 1;
state.user.profile.name = "已更新";
state.todos.push({ id: Date.now(), text: "新待办", completed: false });
});
2. 部分对象更新
将新状态与现有状态合并:
const store = createStore({
name: "张三",
age: 25,
email: "zhangsan@example.com",
avatar: "avatar.jpg",
});
// 与现有状态浅合并
store.setState({ name: "李四", age: 30 });
// 结果: { name: "李四", age: 30, email: "zhangsan@example.com", avatar: "avatar.jpg" }
// 显式覆盖(包括 null/undefined)
store.setState({ avatar: null });
// 结果: { name: "李四", age: 30, email: "zhangsan@example.com", avatar: null }
// 未知属性会被忽略
store.setState({ unknownField: "ignored" }); // 无效果
// 结果: { name: "李四", age: 30, email: "zhangsan@example.com", avatar: null }
3. 直接赋值
适合完全状态替换或更喜欢显式赋值:
// 完全替换
store.value = { count: 1, name: "李四" };
// 部分更新(与 setState 相同)
store.value = { count: 5 }; // 合并后: { count: 5, name: "李四" }
4. 静默更新
更新状态而不触发订阅/重新渲染:
// 后台缓存更新
store.setState({ cache: freshData }, { silent: true });
最佳实践
✅ 状态和更新逻辑放在一起
const store = createStore({
count: 0,
increment() {
/* 操作逻辑 */
},
});
✅ 复杂更新使用 Immer 风格
store.setState((state) => {
state.nested.property = newValue;
});
✅ 正确处理异步操作
async fetchData() {
store.setState(state => { state.loading = true; });
try {
// API 调用
} finally {
store.setState(state => { state.loading = false; });
}
}
✅ 后台数据使用静默更新
store.setState({ cache: data }, { silent: true });
相关 API
createProvider
- 创建组件级作用域的 storeuseStoreValue
- 同步 store 最新状态useComputed
- 响应式更新的计算值useWatch
- 监听状态变化并执行副作用