当前位置: 首页 > news >正文

vue3数据持久化方案:pinia-plugin-persistedstate源码浅析

概述

Piniavue3的官方推荐用于数据共享的库,但是Pinia🍍中的数据是存在于浏览器的内存中,当浏览器刷新后,这些数据就会消失。因此我们需要对数据做持久化存储,这个时候就需要用到pinia-plugin-persistedstate

pinia-plugin-persistedstate本质上利用浏览器持久化存储地能力,默认使用localStorage。本文将详细介绍pinia-plugin-persistedstate的使用以及源码剖析,以vue3项目为例。

pinia-plugin-persistedstate的使用

使用pinia-plugin-persistedstate之前需要安装piniapinia-plugin-persistedstate。其使用主要分为两部分

  • main.js中引用,如示例:
import piniaPluginPersistedstate from "pinia-plugin-persistedstate";
const pinia = createPinia();
pinia.use(piniaPluginPersistedstate);
  • store中使用,piniadefineStore的第二个参数,提供一个persist属性,配置该属性即可。
export const useCommonStore = defineStore("common", {persist: {key: "common", // localStorage的建storage: localStorage, //指定存储方式,默认为localStoragepaths: ["menuActiveIndex", "collapse", "state", "currentMenuList"], // 数组中的为state的键,需要持久化的state放在paths中},
});
  • 其效果如下
    在这里插入图片描述

源码剖析

pinia-plugin-persistedstate是为 pinia量身定制的持久化方案,因此我们需要对pinia有一定的了解,可以参考之前的文章Pinia 源码浅析,PS:该文章会持续更新。本文会只讲解pinia中与pinia-plugin-persistedstate有关的部分。

pinia.use 方法

由上可知,通过pinia.use去使用pinia-plugin-persistedstatepinia.use实现如下:

 use(plugin) {if (!this._a && !isVue2) {toBeInstalled.push(plugin);}else {_p.push(plugin);}return this;
},

use方法是在createPinia中定义的,调用use方法,首先会判断_a是否存在以及当前是vue2还是vue3,如果当前_a不存在(即还没有调用app.use(pinia))并且是vue3,则将pinia-plugin-persistedstate插件放到toBeInstalled变量中,否则将插件放到_p中。

放到toBeInstalled的插件会在piniavue3实例调用use方法时push_p中:

toBeInstalled.forEach((plugin) => _p.push(plugin));

由此可知,pinia中的插件全部在_p中。

pinia使用插件

pinia内部使用插件的部分是在createSetupStore中实现的,即defineStore——>useStore——>createSetupStore,其实现如下:

pinia._p.forEach((extender) => {/* istanbul ignore else */if (USE_DEVTOOLS) {//调试部分const extensions = scope.run(() =>extender({store,app: pinia._a,pin

http://www.mrgr.cn/news/23734.html

相关文章:

  • 若依Ruoyi之智能售货机运营管理系统(新增运营运维工单管理)
  • 如何在guitarpro中新建六线谱和简谱并实现简谱在下方?
  • 数据结构应用实例(二)——K均值聚类
  • Vue+SpringBoot+数据库整体开发流程 1
  • Qml 实现水波进度动画条
  • [笔记] 电机工作制以及软硬特性的本质推导
  • LeetCode之高频SQL50题
  • Vue2+JS项目升级为Vue3+TS之jquery的maphilight引入项目(附使用)
  • python如何获取html中的所有链接
  • 儿童护眼灯哪个牌子好?五款眼科医生推荐的台灯分享
  • 诸葛io:消费金融行业智能运营与数智化经营模型构建
  • Kotlin入门实用开发技巧与注意事项
  • YOLOv5 目标计数 | 图片上绘制计数结果
  • “深入解析:MySQL半同步复制的配置指南与实践技巧“
  • 俄罗斯电商没有技巧,OZON换季相关爆品
  • Java-数据结构-栈和队列-习题 (<ゝω・)☆
  • keithley 2430 数字源表
  • vue3+vite+elementPlus修改elementPlus主题色
  • Git 撤销commit
  • Modbus协议基础知识