状态管理 - Pinia
全局状态管理是一个大型系统不可避免的存在,因为经常有一些需要全局共享的信息需要存储,比如用户信息,所以 BhAdmin 中内置了 Pinia 用于信息共享。
使用 Pinia ,目录更加简洁明了。 同时对Typescript的支持更加友好,具有无可比拟的优越性。
位置
├── modulers
│ ├── user (具体模块,以实际项目为准)
│ │ └── index.ts (store定义)
│ │ └── types.ts (store类型)
├── index.ts (用于导出store)
添加新模块
- 添加 state 类型声明
// store/modulers/user/types.ts
export interface UserState {
name: string;
avatar: string;
}
- 定义store,就像定义一个组件一样简单
// store/modulers/user/index.ts
import { defineStore } from 'pinia';
import {
login as userLogin,
getUserInfo,
LoginData,
} from '@/api/user';
import { setToken } from '@/utils/auth';
import { UserState } from './types';
export const useUserStore = defineStore('user', {
state: (): UserState => ({
name: '',
avatar: '',
}),
getters: {
userInfo(state: UserState): UserState {
return { ...state };
},
},
actions: {
// Get user's information
async info() {
const res = await getUserInfo();
this.setInfo(res.data);
},
// Login
async login(loginForm: LoginData) {
const res = await userLogin(loginForm);
setToken(res.data.token);
},
},
});
具体使用
vue
import { defineComponent } from 'vue';
import { useUserStore } from '@/store';
export default defineComponent({
setup() {
const userStore = useUserStore();
const login = () => {
const userInfo ={
username: 'admin',
password: 'admin',
};
await userStore.login(userInfo);
}
return {
login,
}
}
})