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

这篇具有很好参考价值的文章主要介绍了前端开发小技巧 - 【Vue3 + TS】 - 在 TS + Vue3 中使用 Pinia,实现 Pinia 的持久化,优化Pinia(仓库统一管理)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

  • ts 中使用 piniaVue3 基本一致,唯一的不同点在于,需要根据接口文档给 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<User>();
       
       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 ts example,Vue3,javascript,vue.js,前端,typescript

三、实现 Pinia 的持久化

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

3.1、安装 Pinia 持久化插件:

pnpm i pinia-plugin-persistedstate
yarn add pinia-plugin-persistedstate
npm 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<User>();
       
       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'; 进行导入即可;

文章来源地址https://www.toymoban.com/news/detail-845780.html

到了这里,关于前端开发小技巧 - 【Vue3 + TS】 - 在 TS + Vue3 中使用 Pinia,实现 Pinia 的持久化,优化Pinia(仓库统一管理)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端新手Vue3+Vite+Ts+Pinia+Sass项目指北系列文章 —— 第十二章 常用工具函数 (Utils配置)

    在项目开发中,我们经常会使用一些工具函数,也经常会用到例如 loadsh 等工具库,但是这些工具库的体积往往比较大,如果项目本身已经引入了这些工具库,那么我们就没有必要再引入一次,所以我们需要自己封装一些工具函数,来简化我们的开发。 在 src/utils 目录下创建

    2024年02月20日
    浏览(49)
  • 使用vue3 + TS + Pinia + Vant4 + vite搭建商城H5项目框架

    本文主要将如何利用搭建一个初始化的商城H5项目框架。初始化阶段使用的技术栈有:vue3.2、vue-router、 TS 、 Pinia 、 Vant4、Less、vite                         node -v 检测是否有安装node.js,未安装请先去官网安装node.js         终端输入: npm init vite         自定

    2024年02月12日
    浏览(45)
  • Vue3状态管理库Pinia——自定义持久化插件

    个人简介 👀 个人主页: 前端杂货铺 🙋‍♂️ 学习方向: 主攻前端方向,正逐渐往全干发展 📃 个人状态: 研发工程师,现效力于中国工业软件事业 🚀 人生格言: 积跬步至千里,积小流成江海 🥇 推荐学习:🍍前端面试宝典 🍉Vue2 🍋Vue3 🍓Vue2/3项目实战 🥝Node.js🍒

    2024年02月13日
    浏览(30)
  • 使用ExcelJS实现excel的前端导出功能(Vue3+TS)

    ExcelJS :读取,操作并写入电子表格数据和样式到 XLSX 和 JSON 文件。一个 Excel 电子表格文件逆向工程项目。 github中文文档:https://github.com/exceljs/exceljs/blob/master/README_zh.md  封装excel.ts工具文件 表格页面调用excel工具文件 

    2024年02月14日
    浏览(47)
  • vue3 + TS + elementplus + pinia实现后台管理系统左侧菜单联动实现 tab根据路由切换联动内容

    效果图:  home.vue页面代码 left.vue页面代码 tab.vue页面代码 pinia里面的代码 安装 使用插件  在main.ts中注册 路由代码 我把代码放git上了,有需要的自行拉取 https://gitee.com/Flechazo7/vue3.git

    2024年02月09日
    浏览(41)
  • vue3+ts+pinia整合websocket

    先有实时数据需要展示. 由于设备量极大且要对设备参数实时记录展示.axios空轮询不太适合. 选择websocket长连接通讯. 使用pinia原因是pinia具备共享数据性质.可以作为消息队列缓存数据,降低渲染压力.同时方便多个页面或组件获取websocket数据 安装pinia 注册pinia不再详细叙述,自行

    2024年02月11日
    浏览(31)
  • 从零开始Vue3+Element Plus后台管理系统(六)——状态管理Pinia和持久化

    官网:https://pinia.vuejs.org/zh/ Pinia 是 Vue 的专属状态管理库,相比Vuex更好用,优点不多了说官网有,用起来最重要! 在应用的根部注入创建的 pinia 定义store,拿用户登录举个简单例子 在src目录新建文件夹store,然后新建文件user.ts 在Vue页面中使用Pinia 如果我们把登录用户的信息

    2024年02月05日
    浏览(39)
  • vue3+ts+pinia+vite一次性全搞懂

    前提是所处vue环境为vue3,如果失败就查看一下环境是否为vue2,然后删除vue2,安装vue3 这是我报过的错

    2024年02月01日
    浏览(35)
  • 微信小程序uniapp+vue3+ts+pinia的环境搭建

    一.创建uniapp项目 通过vue-cli创建 二.安装依赖: 1.pnpm i 2.运行项目: 将package.json的 3.导入微信小程序开发工具 打开微信开发者工具, 导入 distdevmp-weixin 运行 三. TS 类型校验 在tsconfig.json文件中\\\"compilerOptions\\\"配置项内添加\\\"ignoreDeprecations\\\": “5.0” 额外配置Ts类型校验: 安装类型

    2024年04月10日
    浏览(50)
  • Vite4+Typescript+Vue3+Pinia 从零搭建(2) - ts配置

    项目代码同步至码云 weiz-vue3-template 关于tsconfig的配置字段可查看其他文档,如 typeScript tsconfig配置详解 文件修改如下: 修改文件如下: 新建文件夹 types ,用来存放类型定义。比如新建 index.d.ts : 后续也可以新增其他文件,比如 global.d.ts 存放全局定义, router.d.ts 存放路由定

    2024年02月05日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包