pinia-plugin-persist 解决刷新后,store数据重置

2023-11-08

Pinia 是 Vue 的专属状态管理库,它允许你跨组件或页面共享状态

在某些特定的单页面应用场景下,我们使用常规的 store 来存储数据,很多时候面临着刷新就会被重置,所以,我们急需 pinia-plugin-persist 来实现对某些特定的数据进行状态保持

npm i pinia-plugin-persist

Vue3 main.ts- 配置

import { createApp } from 'vue'
import { createPinia } from 'pinia'
import piniaPersist from 'pinia-plugin-persist'

const pinia = createPinia()
pinia.use(piniaPersist)

createApp({})
  .use(pinia)
  .mount('#app')

Typescript definitions tsconfig.json - 配置

{
  "compilerOptions": {
    "types": [
      "pinia-plugin-persist"
    ]
  },
}

/store/index.js - 定义

export const useUserStore = defineStore('storeUser', {
  state () {
    return {
      firstName: 'S',
      lastName: 'L',
      accessToken: 'xxxxxxxxxxxxx',
    }
  },
  persist: {
    enabled: true,
    strategies: [
      {
        key: 'accessToken',  //自定义 Key值
        storage: localStorage,  // 选择存储方式
		paths: ['accessToken']  // state 中的字段名,按组打包储存
		// assessToken,数据不为空时localStorage才会去存储,数据为空时,不会去存储()
      },
    ],
  },
})


使用

<template>
  <button @click="onButton">点击增加</button>
</template>
<script lang="ts" setup>
import store from '@/store'
const appStore = store.useUserStore()
// computed 可以获取响应式数据
const assessToken = computed(() => { appStore.accessToken })
const onButton = () => {
  console.log(assessToken)
}
</script>
<style lang="scss" scoped></style>

源码解读

type Store = PiniaPluginContext['store'];
type PartialState = Partial<Store['$state']>;

export const updateStorage = (strategy: PersistStrategy, store: Store) => {

  // 默认使用 sessionStorage
  const storage = strategy.storage || sessionStorage
  
  // 默认存储 key 为 store.$id
  const storeKey = strategy.key || store.$id

  if (strategy.paths) {
  
    // 遍历 paths 将对应的属性收集到 finalObj 中
    const partialState = strategy.paths.reduce((finalObj, key) => {
      finalObj[key] = store.$state[key]
      return finalObj
    }, {} as PartialState)
    
    // 执行存储
    storage.setItem(storeKey, JSON.stringify(partialState))
  } else {
  
    // 如果没有 paths,则按整个 store.$state 存储
    storage.setItem(storeKey, JSON.stringify(store.$state))
  }
}


export default ({ options, store }: PiniaPluginContext): void => {

  // 判断插件功能是否开启
  if (options.persist?.enabled) {
  
    // 默认策略实例
    const defaultStrat: PersistStrategy[] = [{
      key: store.$id,
      storage: sessionStorage,
    }]

    const strategies = options.persist?.strategies?.length ? options.persist?.strategies : defaultStrat

    strategies.forEach((strategy) => {
      const storage = strategy.storage || sessionStorage
      const storeKey = strategy.key || store.$id
      const storageResult = storage.getItem(storeKey)

      if (storageResult) {
      
        // 如果 storage 中存在同步数据
        store.$patch(JSON.parse(storageResult))
        updateStorage(strategy, store)
      }
    })

    store.$subscribe(() => {
    
      // 监听 state 变化,同步更新 storage
      strategies.forEach((strategy) => {
        updateStorage(strategy, store)
      })
    })
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pinia-plugin-persist 解决刷新后,store数据重置 的相关文章

随机推荐

  • adb push&pull文件方法

    adb push命令 从电脑上传送文件到设备 adb pull命令 从手机传送文件到电脑 pull命令 从手机传送文件到电脑 a cmd 控制台 adb connect ip 连接设备 b adb devices查看设备连接情况 c 将设备
  • 【VS2010学习笔记】【函数学习】一(VC6.0和VS2010主函数的不同)

    问题 为什么VC6 0中主函数为main 而VS2010中为 tmain 1 Main是所有c或c 的程序执行的起点 tmain是main为了支持unicode所使用的main的别名 tmain 不过是unicode版本的的main 2 t
  • 题目 1052: [编程入门]链表合并

    已有a b两个链表 每个链表中的结点包括学号 成绩 要求把两个链表合并 按学号升序排列 输入格式 第一行 a b两个链表元素的数量N M 用空格隔开 接下来N行是a的数据 然后M行是b的数据 每行数据由学号和成绩两部分组成 输出格式 按照学
  • 相机模型-计算机视觉

    摄像机的基本成像模型 通常称为针孔模型 pinhole model 由三维空间到像平面的中心投影变换给出 如上图 a 所示 空间点Oc是投影中心 它到平面 的距离为f 空间点Xc在平面 上的投影 像 是以点Oc为端点并经过Xc的射线与平面
  • 导出七牛云的数据到本地服务器

    大概半年多以前 七牛云就失效了 一个是欠费再一个是没有绑定域名 听说是七牛云被举报了然后就必须要实名认证了 而且测试域名的时间也变得只有一个月之久 基本没什么作用了 如果绑定域名 需要该域名是备案的域名 这对于大部分自建博客的人来说基本就是
  • Node.js实现简单爬虫 讲解

    一 什么是爬虫 网络爬虫 又称为网页蜘蛛 网络机器人 在FOAF社区中间 更经常的称为网页追逐者 是一种按照一定规则 自动的抓取万维网信息的程序或者脚本 另外一些不常使用的名字还有蚂蚁 自动索引 模拟程序或者蠕虫 搜索引擎 今日头条 网易新
  • torch函数详解

    torchvision torchvision transforms Compose transforms 把几个转换组合 torch nn Conv2d CLASS torch nn Conv2d in channels out chan
  • Webpack5 教程(3)--处理图片资源

    目录 处理图片资源 1 配置 2 添加图片资源 3 使用图片资源 4 运行指令 5 输出资源情况 6 对图片资源进行优化 修改输出资源的名称和路径 1 配置 2 修改 index html 3 运行指令 自动清空上次打包资源 1 配置 2
  • 索引表

    在我们传统的印象中 索引和表是两个不同的东西 我们总是先创建表 然后 根据查询 建立相应的索引 表和索引在物理上属于不同的存储空间 例如你建立了一个好友的通讯录 你经常需要通过指定好友的姓名来查询他的 有关信息 为了提高查询的性能 假设你的
  • Linux系统简介(简单粗暴)

    Linux的诞生 哩呐科斯 Linux之父 Linus Torwalds 1991年10月 发布了0 02版 第一个公开版 内核 1994年03月 发布1 0版内核 UNIX诞生时间为1970年1月1日 这里为什么要说到UNIX呢 主要是L
  • 如何查看jar包里的源码

    java是一种静态语言 需要将代码编译为class文件才能执行 class文件不能直接查看内容 但可以通过反编译工具查看反编译代码 反编译代码与源码去掉注释后的代码比较接近 虽然比源码损失了一部分可读性 但至少有一定的可读性 工具 jd g
  • 用eclipse建立一个servlet类型的文件,配置tomcat及web.xml,并通过网页显示其结果。

    做这个的前提是你已经下载好tomcat了 可去官网下载 https tomcat apache org 步骤一 步骤二 步骤三 步骤四 步骤五 步骤六 步骤七 步骤八 步骤九 步骤十 步骤十一 步骤十二 步骤十三 步骤十四 到此就成功了 还
  • 组播测试小程序

    include
  • 【Arduino学习】03.RGB呼吸灯

    本课程中 将使用 PWM 来控制 RGB LED灯并使其显示不同的颜色 变色灯是由红 R 绿 G 蓝 B 三基色 LED 组成的 双色 LED 是我们十分熟悉的 一般由红光 LED 及绿光 LED 组成 它可以单独发出红光或绿光 若红光及绿
  • Linux服务器上设置全局代理访问外网并验证

    Linux服务器上设置全局代理访问外网并验证 昨天碰到了内网需要访问外网下载的情况 需要在服务器上设置代理 没别的 就记录一下自己跳过的坑 1 前提是已经搭建好了一台代理服务器 2 Linux设置全局代理 编辑文件 vi etc skel
  • 本周leetcode和机器学习的建模过程学习笔记

    机器学习的建模过程笔记 本周Leetlode练习 class Solution def buildArray self target List int n int gt List str res j 0 for i in range 1 t
  • 组合数学总结

    文章目录 一 组合数学基础 1 1 排列与组合 排列 组合 1 2 组合等式及其组合意义 1 3 多项式系数 二 母函数 2 1 普母函数 2 2 指母函数 2 3 正整数分拆 2 3 1 有序拆分 2 3 2 无序拆分 三 递推关系 3
  • python爬取网页时response.status_code返回418,文件读取写入

    问题 response status code为418 问题描述 当我使用Python的requests爬取网页时response和soup都是None 检查后发现response status code为418 错误描述 经过网上查询得知
  • Linux内核启动流程 详解

    Linux内核启动流程 arch arm kernel head armv S 该文件是内核最先执行的一个文件 包括内核入口ENTRY stext 到start kernel间的初始化代码 主要作用是检查CPU ID Architectur
  • pinia-plugin-persist 解决刷新后,store数据重置

    Pinia 是 Vue 的专属状态管理库 它允许你跨组件或页面共享状态 在某些特定的单页面应用场景下 我们使用常规的 store 来存储数据 很多时候面临着刷新就会被重置 所以 我们急需 pinia plugin persist 来实现对某