Skip to content

Store

Store 模块提供了统一的状态管理能力,主要包含用户数据管理和字典数据管理两个核心功能。通过 useStore() 可以轻松访问这些数据状态。

user

用户数据状态管理,提供完整的用户认证和信息缓存功能。

API

名称参数返回值说明
token-string | null获取当前用户 token
setTokendata: Tokenvoid设置用户 token 并自动存储到本地缓存
refreshToken-void刷新用户 token
info-UserInfoEntity获取当前用户信息
get-Promise<void>从服务器获取用户信息
setdata: UserInfoEntityvoid设置用户信息并存储到本地缓存
updatedata: UserInfoEntityPromise<void>更新用户信息(同时调用后端接口)
clear-void清除本地所有用户信息和 token
logout-void退出登录,清除所有数据并跳转到登录页
isNull-boolean判断用户是否已登录(基于用户 ID 字段判断)

类型定义

UserInfoEntity 类型会根据后端用户实体的类型自动生成:

ts
interface UserInfoEntity {
  id?: number;
  unionid?: string;
  avatarUrl?: string;
  nickName?: string;
  phone?: string;
  gender?: number;
  status?: number;
  loginType?: number;
  password?: string;
  description?: string;
  birthday?: string;
  province?: string;
  city?: string;
  district?: string;
  createTime?: string;
  updateTime?: string;
}

interface Token {
  token: string; // 访问令牌
  expire: number; // token 过期时间戳
  refreshToken: string; // 刷新令牌
  refreshExpire: number; // 刷新令牌过期时间戳
}

使用示例

显示用户信息

在模板中绑定用户数据:

vue
<template>
  <cl-text>{{ user.info?.nickName ?? "未登录" }}</cl-text>
</template>

<script lang="ts" setup>
import { useStore } from "@/cool";

const { user } = useStore();
</script>

登录状态检查

ts
import { useStore } from "@/cool";

const { user } = useStore();

// 检查用户是否已登录
if (user.isNull()) {
  console.log("用户未登录,请先登录");
  // 跳转到登录页
  uni.navigateTo({ url: "/pages/user/login" });
} else {
  console.log("当前用户:", user.info?.nickName);
}

更新用户信息

更新用户信息时会同步调用后端接口:

ts
import { useStore } from "@/cool";

const { user } = useStore();

// 更新用户昵称
await user.update({
  nickName: "新昵称",
});

console.log("用户信息更新成功");

Token 管理

ts
import { useStore } from "@/cool";

const { user } = useStore();

// 设置登录 token
user.setToken({
  token: "access_token_here",
  expire: Date.now() + 7200000, // 2小时后过期
  refreshToken: "refresh_token_here",
  refreshExpire: Date.now() + 2592000000, // 30天后过期
});

// 退出登录
user.logout();

dict

字典数据状态管理,提供系统字典数据的缓存和访问功能。

API

名称参数返回值说明
data-DictData[]获取所有字典数据
findkey: stringDictData根据 key 查找对应的字典数据
getkey: DictKeyDictItem[]获取指定类型的字典项列表
getItemkey: DictKey, value: anyDictItem | null根据 key 和 value 获取对应的字典项
getItemskey: DictKey, values: any[]DictItem[]根据 key 和多个 value 批量获取字典项
getItemLabelkey: DictKey, value: anystring根据 key 和 value 获取对应字典项的显示标签
refreshtypes?: DictKey[] | nullPromise<void>刷新字典数据(可指定特定类型)

类型定义

ts
interface DictItem {
  id: number; // 字典项唯一标识
  typeId: number; // 所属字典类型 ID
  label: string; // 显示标签
  name: string; // 字典项名称
  value: any; // 字典项值
  orderNum: number; // 排序序号
  parentId?: number | null; // 父级 ID(用于树形结构)
}

interface DictData {
  key: string; // 字典类型 key
  list: DictItem[]; // 该类型下的字典项列表
}

DictKey 类型会根据后端配置的字典类型自动生成:

ts
type DictKey =
  | "brand" // 品牌类型
  | "occupation" // 职业类型
  | "upgradeType" // 升级类型
  | "complainType" // 投诉类型
  | "feedbackType"; // 反馈类型

使用示例

获取字典列表

ts
import { useStore } from "@/cool";

const { dict } = useStore();

// 获取品牌字典列表
const brandList = dict.get("brand");
console.log(brandList);

/* 输出示例:
[
  {
    id: 1,
    label: "COOL",
    value: 1,
    orderNum: 1
  },
  {
    id: 2,
    label: "闪酷",
    value: 2,
    orderNum: 2
  }
]
*/

获取字典项标签

ts
import { useStore } from "@/cool";

const { dict } = useStore();

// 根据值获取对应的显示标签
const brandLabel = dict.getItemLabel("brand", 1);
console.log(brandLabel); // 输出: "COOL"

刷新字典数据

ts
import { onShow } from "@dcloudio/uni-app";
import { useStore } from "@/cool";

const { dict } = useStore();

// 页面显示时刷新特定字典
onShow(async () => {
  await dict.refresh(["userTag", "userStatus"]);
  console.log("字典数据已更新");
});

// 刷新所有字典数据
await dict.refresh();

注意事项

字典数据同步

  • 应用启动时会自动调用 dict.refresh() 获取所有字典数据
  • 如果后台管理员修改了字典配置,建议在相关页面手动刷新对应的字典数据
  • 字典数据会缓存在本地,避免频繁请求服务器

性能优化建议

  • 使用 getItemLabel() 获取单个标签时性能最佳
  • 批量获取多个字典项时使用 getItems() 方法
  • 合理使用 refresh() 方法,避免不必要的网络请求