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() 方法,避免不必要的网络请求