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

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, //指定存储方式,默认为localStorage
    paths: ["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.kler.cn/a/300029.html

相关文章:

  • 虚幻基础-1:cpu挑选(14600kf)
  • Apache Hive3定位表并更改其位置
  • ASP .NET Core 学习(.NET9)部署(一)windows
  • 使用Redis缓解数据库压力+三种常见问题
  • C++ STL(8)map
  • 【时时三省】(C语言基础)文件的顺序读写
  • frida主动调用init_array中的函数
  • 剪画:分享一款自媒体新手小白都在用的剪辑工具,收藏!
  • 关于 PC打开“我的电脑”后有一些快捷如腾讯视频、百度网盘、夸克网盘、迅雷等各种捷方式在磁盘驱动器上面统一删除 的解决方法
  • AI语音机器人:通过 Azure Speech 实现类人类的交互
  • 欺诈文本分类检测(十四):GPTQ量化模型
  • Spring Cloud之二 微服务注册
  • 【数据结构】顺序表的应用
  • 计算赎金信
  • Element UI:初步探索 Vue.js 的高效 UI 框架
  • 【数据结构】排序算法系列——序言(附源码+图解)
  • Python爱心射线
  • 【VUE】pinia持久化存储
  • python 学习一张图
  • 代码随想录:377. 组合总和 Ⅳ
  • OpenCV结构分析与形状描述符(14)拟合直线函数fitLine()的使用
  • Android Studio下载Gradle失败问题解决
  • C++中string的简单实现
  • 【Hot100】LeetCode—739. 每日温度
  • 【Hot100】LeetCode—322. 零钱兑换
  • 关于武汉芯景科技有限公司的IIC缓冲器芯片XJ4307开发指南(兼容LTC4307)