以下操作,是续接之前第二步——含插件使用及eslint&prettier配置
插件安装使用是重点(极大提高了开发效率)
npm install pinia
// 因为用了“unplugin-auto-import”插件 可以不需要再import Pinia的API
// import { createPinia } from 'pinia'
// 创建pinia状态管理对象
const pinia = createPinia()
export default pinia
// pinia代替vuex
import pinia from './store'
app.use(pinia)
注意点:
一、使用 defineStore() 定义一个 Store ;defineStore() 第一个参数是 storeId (必须要),第二个参数是一个选项对象:中有state(是一个函数返回一个对象)、getters、actions
二、store 是一个用 reactive 包裹的对象,如果直接解构会失去响应性。我们可以使用 storeToRefs() 对其进行解构:
import { removeToken, setToken, getToken } from '@/utils/cookies'
import { login, logout, getInfo, getPermBtm } from '@/api/login'
import { ElMessage } from 'element-plus'
const useUserStore = defineStore('user',{
state: () => {
return {
token: getToken() || '',
name: '',
avatar: '',
roles: [] as any,
nickName: '',
userId: null,
dept: {},
permissions: [],
permBtn: [],
permCode: [],
}
},
getters:{},
actions: {
// 登录
Login(userInfo: any) {
return new Promise((resolve: any, reject: any) => {
login(userInfo)
.then((res: any) => {
if (res.success) {
setToken(res.data)
this.token = res.data
} else {
ElMessage.error(res?.msg)
}
resolve()
})
.catch((error: any) => {
reject(error)
})
})
},
// 获取用户信息
GetInfo() {
if (this.token === '') {
throw Error('token is undefined!')
}
getInfo().then(async (res: any) => {
if (res?.success) {
const user = res.data
const avatar =
user.avatar == ''
? require('@/assets/images/profile.jpg')
: import.meta.env.VUE_APP_BASE_API + user.avatar
if (user.roles && user.roles.length > 0) {
// 验证返回的roles是否是一个非空数组
this.roles = user.roles
} else {
this.roles = ['ROLE_DEFAULT']
}
this.name = user.userName
this.avatar = avatar
this.nickName = user.nickName
this.userId = user.userId
this.dept = user.dept
//获取按钮权限
await getPermBtm().then((btmRes: any) => {
console.log('获取的按钮权限', btmRes)
if (btmRes?.success && btmRes.data.length > 0) {
const permBtn = btmRes.data.map((item: { menuId: any }) => item.menuId)
const permCode = btmRes.data.map((item: { perms: any }) => item.perms || null)
this.permBtn = permBtn
this.permCode = permCode
this.permissions = permCode
}
})
return res
} else {
throw Error('Verification failed, please Login again.')
}
})
},
// 退出系统
LogOut() {
return new Promise((resolve: any, reject: any) => {
logout()
.then(() => {
this.token = ''
this.roles = []
this.permissions = []
removeToken()
resolve()
})
.catch((error: any) => {
reject(error)
})
})
},
// 前端退出
FedLogOut() {
removeToken()
this.token = ''
this.roles = []
this.permissions = []
}
}
})
export default useUserStore
import useUserStore from '@/store/modules/user'
const userStore= useUserStore()
npm i pinia-plugin-persistedstate
// 持久化处理
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
// 创建pinia状态管理对象
const pinia = createPinia()
pinia.use(piniaPluginPersistedstate)
export default pinia
`默认情况下,会以 storeId 作为 key 值,把 state 中的所有状态存储在 sessionStorage 中。我们也可以通过 strategies 进行修改。
import { PersistedStateOptions } from 'pinia-plugin-persistedstate'
/**
* @description pinia持久化参数配置
* @param {String} key 存储到持久化的 name
* @return persist
* */
const piniaPersistConfig = (key: string) => {
const persist: PersistedStateOptions = {
key,
storage: window.localStorage
}
return persist
}
export default piniaPersistConfig
import piniaPersistConfig from '../piniaPersist'
persist: piniaPersistConfig('user')
gitHub组件地址
gitee码云组件地址
基于ElementUi再次封装基础组件文档
vue3+ts基于Element-plus再次封装基础组件文档