小工具知识网

当前位置: 首页 > 行业知识 > 前端开发小技巧 - 【Vue3 + TS】 - 在 TS + Vue3 中使用 Pinia,实现 Pinia 的持久化,优化Pinia(仓库统一管理)

行业知识

前端开发小技巧 - 【Vue3 + TS】 - 在 TS + Vue3 中使用 Pinia,实现 Pinia 的持久化,优化Pinia(仓库统一管理)

2026-11-16 04:37:14 来源:互联网转载

前言

  • ts 中使用 pinia 和 Vue3 基本一致,唯一的不同点在于,需要根据接口文档给 state 标注类型,也要给 actions 标注类型;
  • 以下都是 组合式API 的写法,选项式API 的写法大家可以去官网看看;
    • Pinia;
    • 持久化插件 - pinia-plugin-persistedstate;

      一、定义类型文件

      • 目标文件:src/types/user.d.ts(这里以user.d.ts为例);
      • 代码展示:
        export type User = {    token: string;    refreshToken: string;    avatar: string; // 头像    mobile: string; // 脱敏手机号 - 带星号的手机号    account: string; // 用户名    id: string; // 用户id};

        二、创建 store

        • 目标文件:src/stores/user.ts;
        • 代码展示:
          import { defineStore } from 'pinia';import { ref } from 'vue';import type { User } from '@/types/user';export const useUserStore = defineStore('user', () => {   const userInfo = ref();      const setUserInfo = (u: User) => {       userInfo.value = u;   };      const delUserInfo = () => {       // undefined 是 window 身上的一个属性,大厂里面不推荐直接用 undefined 给变量赋值       // void 是用来创建 undefined,不管它后面跟个啥,得到的都是 undefined;       userInfo.value = void 0;       // 上面的代码等价于下面这个,但是上面的代码更好       // userInfo.value = undefined;   }      return { userInfo, setUserInfo, delUserInfo }});
        • 三、实现 Pinia 的持久化

          • 以往做法:
            • 按照以前的做法是自己手写封装一个函数(setStorage()、getStorage()、delStorage()),需要使用的时候进行导入使用;
            • 这种做法太麻烦了,在 Vue3 中我们可以安装一个插件,进行配置,会自动帮我们实现 Pinia 的持久化;

              3.1、安装 Pinia 持久化插件:

              pnpm i pinia-plugin-persistedstateyarn add pinia-plugin-persistedstatenpm i pinia-plugin-persistedstate

              3.2、将插件添加到 Pinia 的实例上

              • 目标文件:src/main.ts
              • 代码展示:
                import { createPinia } from 'pinia';import persist from 'pinia-plugin-persistedstate';const pinia = createPinia();pinia.use(persist);

                3.3、在 Store 中使用

                • 给 defineStore() 添加第三个参数(配置对象);
                • 代码展示:
                  import { defineStore } from 'pinia';import { ref } from 'vue';import type { User } from '@/types/user';export const useUserStore = defineStore('user', () => {   const userInfo = ref();      const setUserInfo = (u: User) => {       userInfo.value = u;   };      const delUSerInfo = () => {       // undefined 是 window 身上的一个属性,大厂里面不推荐直接用 undefined 给变量赋值       // void 是用来创建 undefined,不管它后面跟个啥,得到的都是 undefined;       userInfo.value = void 0;       // 上面的代码等价于下面这个,但是上面的代码更好       // userInfo.value = undefined;   }      return { userInfo, setUserInfo, delUserInfo }}, { persist: true });

                  3.4、验证

                  • 在 App.vue 中随便定义两个按钮;模拟 登录和 退出登录;
                  • 将 useUserStore 导入到 App.vue 中,调用 setUserInfo() 和 delUserInfo(),查看 localStorage;

                    四、仓库(store)统一管理

                    • 仓库(store)的统一管理分两步:
                      • pinia独立维护;
                      • 仓库(store)统一导出;

                        4.1、pinia独立维护

                        • 以往:
                          • 初始化代码都在 main.ts 中,仓库代码在 stores 文件夹中,代码分散职能不单一;
                          • 优化处理:
                            • 由 stores 统一维护,在 stores/index.ts 中完成 pinia 的初始化,交付 main.ts 使用;
                            • 代码展示:
                              • 目标文件:src/stores/index.ts;
                                import { createPinia } from 'pinia';import persist from 'pinia-plugin-persistedstate';const pinia = createPinia();pinia.use(persist);export default pinia;
                              • 目标文件:src/main.ts;
                                import { createApp } from 'vue';import pinia from '@/stores';import App from './App.vue';const app = createApp(App);app.use(pinia);app.mount('#app');

                                4.2、仓库(store)统一导出

                                • 以往:
                                  • 使用一个仓库 import { useUSerStore } from '@/stores/user.ts'; 不同仓库路径不一致;
                                  • 在每次导入的时候,都需要使用不同的路径,不方便;
                                  • 优化处理:
                                    • 由 stores/index.ts 统一导出,导入路径统一 @/stores,而且仓库维护在 src/stores/modules 中;
                                    • 代码展示:
                                      • 在 src/modules 下面有两个模块 user、cart 这两个;
                                      • 目标文件:src/stores/index.ts;
                                        import { createPinia } from 'pinia';import persist from 'pinia-plugin-persistedstate';const pinia = createPinia();pinia.use(persist);export default pinia;// import { useUserStore } from './modules/user';// import { useCartStore } from './modules/cart';// export { useUserStore, useCartStore };// 对上面的代码进行简化处理// 将 user 模块中的所有的按需导出 在当前文件中进行按需导出export * from './modules/user';export * from './modules/cart';
                                      • 在别的文件使用的时候,直接使用 import { xxx } from '@/store'; 进行导入即可;

上一篇:新浪的服务器放在哪里?

下一篇:揭秘Android直播源码,直播技术的核心解密!