Pinia 的 State 是用户个人信息综合状态维护的“数据底座”,需包含 isLoggedIn、token、userInfo、permissions、expiresAt 等字段,初始化时从 localStorage 恢复,所有变更须封装在 action 中,配合 getters 提供安全派生状态。

Pinia 的 State 是用户个人信息综合状态维护的“数据底座”,不是简单堆字段,而是围绕业务语义组织、兼顾响应性与持久性、支持跨组件一致访问的核心载体。
State 设计需覆盖完整用户生命周期字段
一个健壮的用户 state 应包含登录态标识、基础信息、权限上下文和时效控制字段,例如:
- isLoggedIn:布尔值,直接反映当前是否已认证(不依赖 token 是否存在,避免空字符串或过期 token 的误判)
- token:JWT 或其他凭证字符串,用于请求鉴权;必须与 localStorage 同步读写
- userInfo:对象结构,含 id、name、avatar、email、role 等后端返回的元数据
- permissions:字符串数组,如 ['user:read', 'admin:delete'],支撑细粒度权限判断
- expiresAt:时间戳(毫秒),记录 token 过期时间,用于静默刷新或提前登出
初始化时主动恢复持久化数据
页面刷新后 state 默认清空,必须在 store 创建初期就从 localStorage 拉取并还原关键字段:
- 用
localStorage.getItem('token')和localStorage.getItem('userInfo')获取原始数据 - 对 userInfo 做 JSON.parse 安全处理,token 直接赋值,避免空值污染 state
- 根据 token 是否存在及 expiresAt 是否有效,自动设置
isLoggedIn = true/false - 不依赖组件挂载后再去 fetch 用户信息——state 初始化即具备“可读可用”能力
所有变更必须封装进 action,禁止直接赋值
保持状态可追踪、可调试、可测试的关键是杜绝 store.userInfo = {...} 这类直写操作:
- 定义
login(credentials):统一完成 token 存储、userInfo 解析、isLoggedIn 更新、expiresAt 计算 - 定义
updateProfile(data):只更新 userInfo 中的部分字段,并触发本地存储同步 - 定义
logout():清除 token、userInfo、permissions,重置 isLoggedIn,并清理 localStorage - 每个 action 内部使用
this.$patch({ ... })或逐字段赋值,确保响应式系统正确捕获变化
配合 getters 提供安全、组合式的派生状态
State 是源头,getters 是消费接口。针对用户信息,推荐这些常用 getter:
-
userName:返回userInfo?.name || '游客',避免模板中频繁可选链 -
isExpired:返回Date.now() > this.expiresAt,集中管理过期逻辑 -
hasPermission:接收 permission 字符串,返回this.permissions.includes(permission) -
authHeader:返回this.token ? { Authorization: `Bearer ${this.token}` } : {},供请求拦截器直接使用


















