Skip to content

Pinia 状态管理

Forge 使用 Pinia 3 管理全局状态。你需要了解 Store 的定义方式和使用场景。

Store 定义

typescript
// src/stores/user.ts
import { defineStore } from 'pinia'

export const useUserStore = defineStore('user', () => {
  const token = ref<string>('')
  const userInfo = ref<UserInfo | null>(null)
  const roles = ref<string[]>([])
  const permissions = ref<string[]>([])

  function setToken(value: string) {
    token.value = value
  }

  function setUserInfo(info: UserInfo) {
    userInfo.value = info
  }

  function clear() {
    token.value = ''
    userInfo.value = null
    roles.value = []
    permissions.value = []
  }

  return { token, userInfo, roles, permissions, setToken, setUserInfo, clear }
})

使用 Store

typescript
import { useUserStore } from '@/stores/user'

const userStore = useUserStore()

// 读取状态
console.log(userStore.token)
console.log(userStore.userInfo)

// 调用方法
userStore.setToken('xxx')
userStore.clear()

核心 Store

Store路径职责
useUserStorestores/user.tsToken、用户信息、角色权限
usePermissionStorestores/permission.ts菜单、路由、按钮权限
useAppStorestores/app.ts应用配置(主题、折叠状态)

useUserStore

typescript
const userStore = useUserStore()

// 登录
await userStore.login({ username: 'admin', password: '123456' })

// 获取用户信息
await userStore.getInfo()

// 判断是否登录
if (userStore.token) { ... }

// 判断是否有权限
if (userStore.permissions.includes('system:user:list')) { ... }

// 退出登录
userStore.clear()

usePermissionStore

typescript
const permissionStore = usePermissionStore()

// 获取菜单
const menus = permissionStore.menus

// 获取路由
const routes = permissionStore.routes

// 生成动态路由
await permissionStore.generateRoutes()

useAppStore

typescript
const appStore = useAppStore()

// 侧边栏折叠
appStore.toggleSidebar()

// 主题切换
appStore.toggleTheme()

状态持久化

Token 等需要持久化的状态使用 localStorage

typescript
// 存储
localStorage.setItem('token', token)

// 读取
const token = localStorage.getItem('token') || ''

组合式函数中使用

typescript
import { useUserStore } from '@/stores/user'

export function usePermission() {
  const userStore = useUserStore()

  const hasPermission = (perm: string) => {
    return userStore.permissions.includes(perm)
  }

  return { hasPermission }
}

组件中使用

vue
<script setup lang="ts">
import { useUserStore } from '@/stores/user'

const userStore = useUserStore()

// 响应式引用
const nickname = computed(() => userStore.userInfo?.nickname || '')
</script>

<template>
  <div>{{ nickname }}</div>
</template>

注意事项

  • Store 使用组合式 API 定义defineStore + setup 函数)
  • 不要在 Store 中直接操作 API,API 调用放在 Store 方法内部
  • 持久化只存必要状态(如 Token),不存所有状态
  • Store 是单例的,在任意组件中 useUserStore() 返回同一实例

Forge Admin — 基于 Vue3 + Spring Boot 的企业级后台管理框架