Echo 状态管理库
Echo 是一个轻量级的状态管理库,专为 React 应用设计,支持多种存储模式和丰富的状态管理功能。
特性
- 支持多种存储模式(临时存储、LocalStorage、IndexedDB)
- 跨窗口状态同步
- 内置 React Hooks 集成
- 状态订阅支持
- 选择器支持
安装
bash
npm install echo-state
基本用法
创建状态
typescript
import { Echo } from "echo-state";
// 创建 Echo 实例
const userStore = new Echo({
name: "",
age: 0,
isLoggedIn: false,
});
读取状态
typescript
// 获取当前状态
const currentState = userStore.current;
console.log(currentState.name);
// 异步获取状态(推荐,特别是在使用持久化存储时)
userStore.getCurrent().then((state) => {
console.log(state.name);
});
// 等待初始化完成并可选择设置状态
userStore.ready().then(() => {
console.log(userStore.current);
});
// 等待初始化并设置状态(一步完成)
userStore.ready({ name: "张三" }).then(() => {
console.log(userStore.current);
});
// 在初始化时使用函数更新状态
userStore.ready((state) => ({ ...state, age: 25 })).then(() => {
console.log(userStore.current);
});
更新状态
typescript
// 部分更新
userStore.set({ name: "张三" });
// 使用函数更新(可以基于当前状态计算新状态)
userStore.set((state) => ({
age: state.age + 1,
}));
// 完全替换状态
userStore.set({ name: "李四", age: 30, isLoggedIn: true }, { replace: true });
删除状态属性
typescript
userStore.delete("age");
重置状态
typescript
userStore.reset();
存储模式
Echo 支持三种存储模式:临时存储、LocalStorage 和 IndexedDB。
临时存储(默认)
typescript
// 默认是临时存储,或显式指定
userStore.temporary();
LocalStorage 存储
typescript
userStore.localStorage({
name: "user-store", // 存储键名
sync: true, // 是否跨窗口同步
});
IndexedDB 存储
typescript
userStore.indexed({
name: "user-store", // 存储键名
database: "user-database", // 数据库名称
object: "userData", // 对象仓库名称,默认为 'echo-state'
sync: true, // 是否跨窗口同步
});
在 React 中使用
Echo 提供了内置的 React Hook 支持。
基本用法
tsx
import React from "react";
import { Echo } from "echo-state";
const counterStore = new Echo({ count: 0 });
function Counter() {
// 使用 Echo 的 use hook 获取状态
const state = counterStore.use();
return (
<div>
<p>当前计数: {state.count}</p>
<button onClick={() => counterStore.set((s) => ({ count: s.count + 1 }))}>
增加
</button>
</div>
);
}
使用选择器
tsx
function CounterDisplay() {
// 只订阅 count 属性的变化
const count = counterStore.use((state) => state.count);
return <p>当前计数: {count}</p>;
}
状态订阅
你可以不使用 React Hook 直接订阅状态变化。
typescript
// 添加监听器
const unsubscribe = userStore.subscribe((state) => {
console.log("状态已更新:", state);
});
// 移除监听器
unsubscribe();
// 或使用显式的添加/移除方法
const listener = (state) => console.log("状态已更新:", state);
userStore.addListener(listener);
userStore.removeListener(listener);