前端开发小技巧 - 【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.mzph.cn/news/742345.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Flutter 面试题】在Flutter中如何处理用户输入和手势操作?

【Flutter 面试题】在Flutter中如何处理用户输入和手势操作&#xff1f; 文章目录 写在前面解答补充说明完整代码示例运行结果详细说明 写在前面 &#x1f64b; 关于我 &#xff0c;小雨青年 &#x1f449; CSDN博客专家&#xff0c;GitChat专栏作者&#xff0c;阿里云社区专家…

gpt-4-all模型中转实现

最近才完成这个功能&#xff0c;相信知道这个模型的人&#xff0c;应该已经熟悉了。这是我的中转&#xff1a;openai-api Chatbox配置如下&#xff1a; 模型测试&#xff1a; 1&#xff09;图片生成 2&#xff09;文件分析&#xff0c;链接读取&#xff1a;

docker部署多功能网络工具箱

功能 查看自己的IP&#xff1a;从多个 IPv4 和 IPv6 来源检测显示本机的IP 查看IP信息&#xff1a;显示所有 IP 的相关信息 可用性检测&#xff1a;检测一些网站的可用性 WebRTC 检测&#xff1a;查看使用 WebRTC 连接时使用的 IP DNS 泄露检测&#xff1a;查看 DNS 出口信息 …

修改dataV-vue3 中的组件 装饰5 decoration5 的动画重复次数

dataV-vue3 文档 装饰 5 是一个具有动画效果的 背景线框 但是开发者 没有给我们 提供 动画重复次数的 配置项&#xff0c;只提供了单次动画时长&#xff0c;如果把单词动画时长设置的很长&#xff0c;动画的延展速度也会跟着变得很慢&#xff0c;不符合预期。 使用开发者工具…

使用Mybatis-plus来完成多表联查

1、需要进行多表联查的表 电影表&#xff08;t_film&#xff09;、电影地区表(t_film_type)、电影分类表&#xff08;t_film_region&#xff09; 2、在项目中创建表的实体类 FIlm类、FilmType类、FilmRegion类 3、完善实体 &#xff08;1&#xff09;Data lombok依赖…

安装Mysql和Mycli插件

一、安装数据库 1.重定向生成配置文件 cat >/etc/yum.repos.d/mysql.repo <<EOF [mysql57-community] nameMySQL 5.7 Community Server baseurlhttp://repo.mysql.com/yum/mysql-5.7-community/el/7/x86_64/ enabled1 gpgcheck0 EOF 2.yum安装 yum -y install mysq…

数据结构——通讯录项目

1.通讯录的介绍 顺序表是通讯录的底层结构。 通讯录是将顺序表的类型替换成结构体类型来储存用户数据&#xff0c;通过运用顺序表结构来实现的。 用户数据结构&#xff1a; typedef struct PersonInfo {char name[12];char sex[10];int age;char tel[11];char addr[100]; }…

跨境电子商务支付与结算

一、跨境电子商务支付与结算的业务架构 跨境电子商务支付与结算的业务架构&#xff0c;结合跨境电子商务支付与结算的技术架构&#xff0c;其业务架构主要包括以下五大模块 &#xff08;1&#xff09;商户模块。商户模块包括虚拟账户、管理平台、多币种收银台、争议管理。 &…

【备战蓝桥杯系列】蓝桥杯国二选手笔记二:算法模版笔记(Java)

感谢大家的点赞&#xff0c;关注&#xff0c;评论。准备蓝桥杯的同学可以关注一下本专栏哦&#xff0c;不定期更新蓝桥杯笔记以及经验分享。本人多次参加过蓝桥杯&#xff0c;并获得过蓝桥杯国二的成绩。 算法模版笔记&#xff08;Java&#xff09; 这篇文章给大家分享我的蓝桥…

LeetCode 1315.祖父节点值为偶数的节点和

给你一棵二叉树&#xff0c;请你返回满足以下条件的所有节点的值之和&#xff1a; 该节点的祖父节点的值为偶数。&#xff08;一个节点的祖父节点是指该节点的父节点的父节点。&#xff09; 如果不存在祖父节点值为偶数的节点&#xff0c;那么返回 0 。 示例&#xff1a; 输入…

php apache 后台超时设置

最近在写一个thinkphp项目的时候&#xff0c;发现Ajax从后端请求数据时间比较长&#xff0c;大概需要45秒左右&#xff0c;但是一旦请求时间超过40s&#xff0c;页面就会超时500了&#xff0c;一开始以为是ajax请求时间不能太长&#xff0c;后来将Ajax请求改为同步且timeout设置…

2024长三角快递物流供应链与技术装备展览会(杭州站)

2024.7.8-10 杭州国际博览中心 科技创新&#xff0c;数字赋能 同期举办&#xff1a;数字物流技术展 新能源商用车及物流车展 电商物流包装展 冷链物流展 指导单位 国家邮政局发展研究中心浙江省邮政管理局中国快递协会 承办单位 上海信世展览服务有限公司 主办单位 浙江…

H5简约星空旋转引导页源码

源码名称&#xff1a;H5简约星空旋转引导页 源码介绍&#xff1a;一款带有星空旋转背景特效的源码&#xff0c;带有四个按钮 需求环境&#xff1a;H5 下载地址&#xff1a; https://www.changyouzuhao.cn/11655.html

数据结构:红黑树的模拟实现

目录 1、什么是红黑树&#xff1f; 2、红黑树的相关操作与实现 1、节点定义 2、查找操作 3、插入操作 1、cur为红&#xff0c;p为红&#xff0c;g为黑&#xff0c;cur存在且为红 2、cur为红&#xff0c;p为红&#xff0c;g为黑&#xff0c;u不存在/u存在且为黑 4、判断…

能发顶会!GNN结合LLMs的三大创新思路!新SOTA准确率提升10倍

LLMs在处理NLP任务方面表现出色&#xff0c;而GNNs在挖掘和分析复杂关系数据&#xff08;图数据&#xff09;方面展现出其卓越的能力。这种趋势催生了将这两种技术整合的研究兴趣&#xff0c;为解决更多领域的实际问题。GNN结合LLMs也逐渐成为了研究的热点。 GNNLLMs可以发挥二…

集智书童 | 炸裂 !轻量化YOLO | ShuffleNetv2与Transformer结合,重塑YOLOv7成就超轻超快YOLO

本文来源公众号“集智书童”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;炸裂 &#xff01;轻量化YOLO | ShuffleNetv2与Transformer结合&#xff0c;重塑YOLOv7成就超轻超快YOLO 随着移动计算技术的迅速发展&#xff0c;在移动…

ECharts饼图图例消失踩的坑

在使用Echarts的饼图时&#xff0c;当时做法是在图例数小于8时显示全部的图例&#xff0c;在大于8的时候显示前8个图例。于是用了两种不同的方式处理。导致出现切换时间后图例不显示的情况。 错误过程&#xff1a; 在进行图例生成时采用了两种不同的方式&#xff1a; ①如果…

打造你的HTML5打地鼠游戏:零基础入门教程

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

Rust生命周期和生命周期声明‘作用Missing lifetime specifier

Missing lifetime specifier&#xff1a;报错说明缺失声明周期声明 Rust 生命周期机制是与所有权机制同等重要的资源管理机制。 之所以引入这个概念主要是应对复杂类型系统中资源管理的问题。 引用是对待复杂类型时必不可少的机制&#xff0c;毕竟复杂类型的数据不能被处理器…

UDP连接树莓派时提高连接速度,降低卡顿感

背景 树莓派4B刷的是ubuntu20.4系统&#xff0c;使用win10自带的远程桌面连接和其连接&#xff0c;卡的一批&#xff0c;于是探索并记录下如何降低连接卡顿感 步骤一 点击显示选项&#xff0c; 降低显示配置和颜色深度&#xff1a; 步骤二 我的树莓派是通过电脑移动热点的方式…