前端开发小技巧 - 【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 }
    });
    
  • image.png

三、实现 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'; 进行导入即可;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/455437.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Text-to-SQL 工具Vanna进阶|数据库对话机器人的多轮对话

跟数据库对话机器人对话,我可不止一个问题。 可能基于第一句问话,还有第二句、第三句问话。。。第N句对话。所以本文测试了多轮对话功能。 单轮对话的环境搭建参考博客 Text-to-SQL 工具Vanna + MySQL本地部署 | 数据库对话机器人 我的数据是这样 1. 基础配置 import vann…

深入解析Java中锁机制以及底层原理

一、概述 1.1 背景 概念&#xff1a;锁是多线程编程中的机制&#xff0c;用于控制对共享资源的访问。可以防止多个线程同时修改或读取共享资源&#xff0c;从而保证线程安全。 作用&#xff1a;锁用于实现线程间的互斥和协调&#xff0c;确保在多线程环境下对共享资源的访问顺…

前端性能优化——javascript

优化处理&#xff1a; 讲javascript脚本文件放到body标记的后面 减少页面当中所包含的script标记的数量 课堂练习&#xff1a; 脚本优化处理 使用原生JavaScript完成操作过程。 document.querySelector document.querySelectorAll classList以及类的操作API Element.class…

LLM之RAG实战(二十九)| 探索RAG PDF解析

对于RAG来说&#xff0c;从文档中提取信息是一种不可避免的场景&#xff0c;确保从源文件中提取出有效的内容对于提高最终输出的质量至关重要。 文件解析过程在RAG中的位置如图1所示&#xff1a; 在实际工作中&#xff0c;非结构化数据比结构化数据丰富得多。如果这些海量数据无…

记录西门子:SCL设置不同顺序

一台搅拌的设备&#xff0c;需要控制三种料的进料顺序和进料重量&#xff0c;顺序和重量可以随便设定&#xff0c;也可以是几十种料。触摸屏上面有A、B、C三种液体原料&#xff0c;需要设定三种液体原料重量&#xff0c;并设定序号。 假设如下面所示设定&#xff1a;那将先打开…

java数据结构与算法刷题-----LeetCode90. 子集 II

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 解题思路:时间复杂度O( n 2 ∗ n n^2*n n2∗n),空间复杂度O(n) 7…

开箱机自动化装箱技术:原理、应用与未来趋势

在物流、电商等行业中&#xff0c;开箱机作为自动化装箱技术的核心设备&#xff0c;正逐渐改变着传统的包装方式&#xff0c;为企业带来了效率和成本的双重优化。星派将从开箱机的原理出发&#xff0c;详细解析其应用领域&#xff0c;并展望未来的发展趋势。 一、开箱机的工作原…

《高效便捷,探索快递柜系统架构的智慧之路》

随着电商业务的蓬勃发展&#xff0c;快递柜系统作为一种高效、便捷的最后一公里配送解决方案&#xff0c;正在受到越来越多企业和消费者的青睐。本篇博客将深入探讨快递柜系统的架构设计理念、优势和实践&#xff0c;帮助读者了解如何构建智能化的快递柜系统&#xff0c;提升物…

【UE5】非持枪状态蹲姿移动的动画混合空间

项目资源文末百度网盘自取 在BlendSpace文件夹中单击右键选择动画(Animation)中的混合空间(Blend Space) &#xff0c;选择SK_Female_Skeleton&#xff0c;命名为BS_NormalCrouch 打开BS_NormalCrouch 水平轴表示角色的方向&#xff0c;命名为Direction&#xff0c;方向的最…

教师如何搭建学生查询考试分数的平台?

随着信息技术的快速发展&#xff0c;搭建一个学生查询考试分数的平台已经成为现代教育管理的重要组成部分。这样的平台不仅可以提高成绩管理的效率&#xff0c;还能为学生提供便捷、及时的成绩查询服务。那么&#xff0c;作为教师&#xff0c;我们应该如何搭建这样一个平台呢&a…

低代码开发平台,快速搭建开源MES系统

MS低代码云MES作为一家专注于提供生产制造数字化方案的服务商&#xff0c;“以客户为中心”、以“数据驱动、智能化、互联化”为企业的核心标签&#xff0c;以低代码平台为切入点&#xff0c;帮助企业构建以人为本的未来供应链生态系统&#xff0c;实现制造企业的智能化转型。 …

Simple Admin:基于Go Zero的大型项目分布式微服务后端管理系统

Simple Admin 是一个开箱即用的分布式微服务后端管理系统&#xff0c;基于go-zero开发&#xff0c;为开发中大型后台提供了丰富的功能&#xff0c;支持三端代码生成。 官方自带多种扩展&#xff0c;助力中小企业快速上云&#xff0c;快速迭代。适合用于微服务学习和商用&#x…

如何拆解技术瓶颈的难点

以大化小的思路 解决一个一个小问题从而解决最终问题 三段论&#xff1a; 抽象能力 职责领域划分 分层构建解决方案 案例&#xff1a;全局分布式事务的解决方案 抽象能力&#xff1a;全局分布式 是由一个个小的事务组合而成的&#xff0c;其中一个分布式事务出现问题&#xff…

VsCode免密登录

创建本地密匙 按下WinR输入cmd&#xff0c;输入 ssh-keygen -t rsa然后连续回车直到结束 找到Your public key has been saved in C:\Users\Administrator/.ssh/id_rsa.pub&#xff0c;每个人都不一样找到密匙所在地 打开id_rsa.pub这个文件&#xff0c;可以用记事本打开&am…

wayland(xdg_wm_base) + egl + opengles 渲染使用纹理贴图的旋转 3D 立方体实例(十三)

文章目录 前言一、使用 stb_image 库加载纹理图片1. 获取 stb_image.h 头文件2. 使用 stb_image.h 中的相关接口加载纹理图片3. 纹理图片——cordeBouee4.jpg二、渲染使用纹理贴图的旋转 3D 立方体1. egl_wayland_texture_cube.c2. Matrix.h 和 Matrix.c3. xdg-shell-client-pr…

Nacos 集群搭建

1 . 集群结构图 : 其中包括3个nacos结点&#xff0c;然后一个负载均衡器代理3个Nacos。这里负载均衡器可以使用nginx ; 我们计划的集群结构 : 三个nacos结点的地址 : 节点ipportnacos1192.168.150.18845nacos2192.168.150.18846nacos3192.168.150.18847 2 . 搭建集群 搭…

LeetCode 2864. 最大二进制奇数

文章目录 LeetCode 2864. 最大二进制奇数思路1AC CODE思路2AC CODE LeetCode 2864. 最大二进制奇数 题目链接&#xff1a;https://leetcode.cn/problems/maximum-odd-binary-number/description/ 思路1 由于二进制基数的最后一位必须是1&#xff0c;而其他位越大越好&#xf…

激活函数Mish

paper&#xff1a;Mish: A Self Regularized Non-Monotonic Activation Function official implementation&#xff1a;https://github.com/digantamisra98/Mish 背景 在早期文献中&#xff0c;Sigmoid和TanH激活函数被广泛使用&#xff0c;随后在深度神经网络中失效。相比于…

【小沐学C#】C#文件读写方式汇总

文章目录 1、简介2、相关类介绍3、代码示例3.1 FileStream&#xff08;流文件&#xff09;3.2 StreamReader / StreamWriter &#xff08;文本文件&#xff09;3.2.1 StreamReader3.2.2 StreamWriter 3.3 BinaryReader / BinaryWriter &#xff08;二进制文件&#xff09;3.3.1…

2024.03.13作业

要求&#xff1a;设计一个Per类&#xff0c;类中包含私有成员:姓名、年龄、指针成员身高、体重&#xff0c;再设计一个Stu类&#xff0c;类中包含私有成员:成绩、Per类对象p1&#xff0c;设计这两个类的构造函数、析构函数和拷贝构造函数。 #include <iostream> #includ…