Skip to content

状态管理

TIP

@vben/stores 已在各 app 下统一引入,无需单独安装。包内同时重新导出了 piniadefineStorestoreToRefs,业务侧可统一从 @vben/stores 引入。

用户信息 Store

useUserStore,store id 为 core-user,封装用户信息与角色。

UserState 状态定义
字段默认值说明
userInfonull用户信息
userRoles[]用户角色

设置用户信息

setUserInfo(userInfo):设置用户信息,并自动从 userInfo.roles 同步角色到 userRoles

ts
ts
import { useUserStore } from '@vben/stores';

const userStore = useUserStore();
userStore.setUserInfo({ id: 1, name: 'vben', roles: ['admin'] });
userStore.userRoles; // ['admin']

useUserStore 未配置 persist——用户信息属于运行时态,通常在登录后由接口返回,退出登录后即随之失效。

设置用户角色

setUserRoles(roles):直接设置用户角色列表。

ts
ts
import { useUserStore } from '@vben/stores';

const userStore = useUserStore();
userStore.setUserRoles(['admin', 'editor']);
userStore.userRoles; // ['admin', 'editor']

获取用户信息

useUserStore 未提供专门的 getter,直接访问 state 即可读取。需要响应式时用 storeToRefs 解构。

ts
ts
import { storeToRefs, useUserStore } from '@vben/stores';

const userStore = useUserStore();

// 直接访问
userStore.userInfo;
userStore.userRoles;

// 保持响应式
const { userInfo, userRoles } = storeToRefs(userStore);

时区 Store

useTimezoneStore,store id 为 core-timezone,采用 setup store 风格封装时区状态。

暴露的状态与方法
名称说明
timezone当前时区,初始值取自 getCurrentTimezone()
setTimezone(timezone)设置时区,并同步到 dayjs 默认时区
getTimezoneOptions()获取时区选项列表,默认来自 DEFAULT_TIME_ZONE_OPTIONS
$reset()重置时区到 getCurrentTimezone()

设置时区

setTimezone(timezone):设置当前时区,并同步到 dayjs 默认时区(dayjs.tz.setDefault)。

ts
ts
import { useTimezoneStore } from '@vben/stores';

const store = useTimezoneStore();
await store.setTimezone('America/New_York');
store.timezone; // 'America/New_York'

获取时区选项列表

getTimezoneOptions():返回时区选项列表,默认来自 DEFAULT_TIME_ZONE_OPTIONS,可被 setTimezoneHandler 覆盖。

ts
ts
import { useTimezoneStore } from '@vben/stores';

const store = useTimezoneStore();
const options = await store.getTimezoneOptions();
// [{ label: '东八区', value: 'Asia/Shanghai' }, ...]

重置时区

$reset():将 timezone 重置为 getCurrentTimezone() 返回的当前时区。仅重置 store 内部引用,不会同步 dayjs 默认时区(只有 setTimezone 会同步)。

ts
ts
import { useTimezoneStore } from '@vben/stores';

const store = useTimezoneStore();
store.$reset();
store.timezone; // 回到 getCurrentTimezone() 的值

注入自定义时区处理器

setTimezoneHandler:注入自定义的时区处理模块,可覆盖 getTimezone / getTimezoneOptions / setTimezone 三个方法,便于对接后端接口存储用户时区偏好。

ts
ts
import { setTimezoneHandler, useTimezoneStore } from '@vben/stores';

setTimezoneHandler({
  async getTimezone() {
    return (await fetchUserSettings()).timezone;
  },
  async setTimezone(timezone) {
    await saveUserSettings({ timezone });
  },
  async getTimezoneOptions() {
    return [{ label: '东八区', value: 'Asia/Shanghai' }];
  },
});

const store = useTimezoneStore();
await store.setTimezone('Asia/Shanghai');

持久化策略

ts
ts
persist: {
  pick: ['timezone'];
}

timezone 字段会被持久化,刷新页面后保留;setTimezoneHandler 注入的处理逻辑属于运行时配置,不持久化。

贡献者

The avatar of contributor named as 金毛88 金毛88
The avatar of contributor named as Dream Dream
The avatar of contributor named as Liu Liu

页面历史

基于 MIT 许可发布.