Pinia存储用户状态

85 阅读2分钟

1. Pinia 和 Vuex 有什么区别?为什么本项目选择了 Pinia?

答案:
Pinia 是 Vue 官方推荐的状态管理库,和 Vuex 相比,Pinia 更加轻量、API 更加简洁,支持 TypeScript 更友好,且与 Vue3 的 Composition API 深度集成。在本项目中,web-admin/src/store/ 目录下采用了 Pinia 进行全局状态管理,比如用户信息、菜单、主题等。Pinia 的模块化和类型推断能力让我们在管理如用户登录状态、权限菜单等复杂状态时更加高效和易维护。


2. 如何在 Pinia 中存储和管理用户登录状态?请结合项目举例说明。

答案:
在本项目中,可以在 web-admin/src/store/modules/user.ts(假设有该文件,若没有可在 index.ts 扩展)中定义用户状态的 store。例如:

import { defineStore } from 'pinia';

export const useUserStore = defineStore('user', {
  state: () => ({
    token: '',
    userInfo: null,
  }),
  actions: {
    setToken(token) {
      this.token = token;
    },
    setUserInfo(info) {
      this.userInfo = info;
    },
    logout() {
      this.token = '';
      this.userInfo = null;
    }
  }
});

在登录后,调用 setTokensetUserInfo 存储用户信息,实现全局可用的用户状态。


3. 如何在组件中访问和修改 Pinia 中的用户状态?

答案:
在 Vue 组件中,可以通过 useUserStore 访问和修改用户状态。例如在 web-admin/src/views/Login.vue 登录成功后:

import { useUserStore } from '@/store/modules/user';

const userStore = useUserStore();
userStore.setToken(response.token);
userStore.setUserInfo(response.userInfo);

这样,其他组件如 TopHeader.vueSideMenu.vue 也可以通过同样方式访问用户信息,实现如显示用户名、权限菜单等功能。


4. Pinia 的状态如何持久化?在本项目中如何实现刷新页面后用户状态不丢失?

答案:
Pinia 本身不自带持久化功能,但可以结合插件如 pinia-plugin-persistedstate 实现状态持久化。在本项目中,可以在 store/index.ts 引入该插件:

import piniaPluginPersistedstate from 'pinia-plugin-persistedstate';

const pinia = createPinia();
pinia.use(piniaPluginPersistedstate);

然后在用户 store 中配置 persist: true,这样用户 token、userInfo 就会自动存储到 localStorage,页面刷新后依然保留登录状态。


5. 如何结合 Pinia 实现权限控制?本项目是如何做的?

答案:
本项目通过 Pinia 存储用户信息和权限菜单(如 store/modules/menu.ts),在路由守卫(router/index.ts)中根据用户状态和权限判断是否允许访问某些页面。例如:

router.beforeEach((to, from, next) => {
  const userStore = useUserStore();
  if (!userStore.token && to.path !== '/login') {
    next('/login');
  } else {
    // 检查权限菜单
    next();
  }
});

这样结合 Pinia 的全局状态和路由守卫,实现了基于用户状态的权限控制。