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
好的,我会为您提供 Pinia 数据持久化储存插件(pinia-plugin-persistedstate)的详细代码配置。 首先,您需要安装 `pinia-plugin-persistedstate` 插件: ``` npm install pinia-plugin-persistedstate ``` 然后,在您的 Vue.js 项目中,您需要创建一个 Pinia 实例,并使用 `use` 方法加载 `pinia-plugin-persistedstate` 插件: ```javascript import { createPinia } from 'pinia' import { createPersistedState } from 'pinia-plugin-persistedstate' const pinia = createPinia() pinia.use(createPersistedState({ key: 'my-app-state', // 存储在本地存储中的键名 initialState: () => ({ // 初始状态 count: 0, todos: [] }), storage: window.localStorage // 存储在哪个存储中(可选) })) ``` 以上代码中,我们使用了 `createPersistedState` 方法创建一个持久化状态插件实例,并将其传递给 `pinia.use()` 方法以加载插件。 在 `createPersistedState` 方法中,您需要传递一个对象参数,包含以下选项: - `key`:在本地存储中存储状态的键名。 - `initialState`:状态的初始值。这可以是一个对象或一个函数,该函数返回一个对象。 - `storage`:指定存储状态的存储对象。默认是 `window.localStorage`。 现在,您可以在 Pinia store 中使用持久状态了。例如: ```javascript import { defineStore } from 'pinia' export const useCounterStore = defineStore('counter', { state: () => ({ count: 0 }), actions: { increment() { this.count++ }, decrement() { this.count-- } } }) ``` 以上代码中,我们定义了一个简单的计数器存储。现在,我们可以在组件中使用 `useCounterStore`: ```html <template> <div> <p>Count: {{ count }}</p> <button @click="increment">+</button> <button @click="decrement">-</button> </div> </template> <script> import { useCounterStore } from './store' export default { setup() { const counterStore = useCounterStore() return { count: counterStore.count, increment: counterStore.increment, decrement: counterStore.decrement } } } </script> ``` 现在,每当用户增加或减少计数器时,状态都会自动持久化到本地存储中。当用户刷新页面或重新打开应用程序时,状态将从本地存储中自动加载。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jinuss

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值