【pinia持久化存储】使用pinia和pinia-plugin-persistedstate依赖进行数据的持久化存储

news2024/11/25 19:42:36

简言

使用pinia和pinia-plugin-persistedstate依赖进行数据的持久化存储。
存储方式 :

  • localStorage
  • sessionStorage

pinia-plugin-persistedstate 中文官网

pinia 中文官网

安装

安装和使用 pinia ,请参考使用pinia文章。

安装 pinia-plugin-persistedstate :

npm i pinia-plugin-persistedstate
# 或
pnpm i pinia-plugin-persistedstate
# 或
yarn add pinia-plugin-persistedstate

使用pinia-plugin-persistedstate持久化存储

挂载

使用前先将 pinia-plugin-persistedstate添加到pinia实例上。

import { createPinia } from 'pinia'
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'

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

在添加的时候,可以添加参数修改pinia-plugin-persistedstate的 默认配置,例如:

pinia.use(piniaPluginPersistedstate({
	auto:true,	//	该配置将会使所有 Store 持久化存储,且必须配置 persist: false 显式禁用持久化。
    storage: sessionStorage,	//	默认持久化存储方式 修改为 sessionStorage
  })

上面的修改的默认配置是 开启所有的store持久化存储,且默认存储方式是sessionStorage

store上使用

创建 Store 时,将 persistent 选项设置为 true。

import { defineStore } from 'pinia'

export const useStore = defineStore('main', {
  state: () => {
    return {
      someState: '你好 pinia',
    }
  },
  persist: true,
})

或者

import { defineStore } from 'pinia'

export const useStore = defineStore(
  'main',
  () => {
    const someState = ref('你好 pinia')
    return { someState }
  },
  {
    persist: true,
  }
)

上面的store内所有的数据都会开启持久化存储,使用默认配置。

默认配置

  • 使用 localStorage 进行存储
  • store.$id 作为 storage 默认的 key
  • 使用 JSON.stringify/JSON.parse 进行序列化/反序列化
  • 整个 state 默认将被持久化

个性化配置

persist可以是一个对象。

import { defineStore } from 'pinia'

export const useStore = defineStore('main', {
  state: () => ({
    someState: '你好 pinia',
  }),
  persist: {
    // 在这里进行自定义配置
  },
})

persist对象可以配置以下属性:

  • key
    类型:string
    默认值:store.$id
    Key 用于引用 storage 中的数据
  • storage
    类型:StorageLike
    默认值:localStorage
    将数据持久化到的 storage 中,必须具有 getItem: (key: string) => string | null 和 setItem: (key: string, value: string) => void 两个方法
  • paths
    类型:string[]
    默认值:undefined
    用于指定 state 中哪些数据需要被持久化。[] 表示不持久化任何状态,undefined 或 null 表示持久化整个 state
  • serializer
    类型:Serializer
    默认值:JSON.stringify/JSON.parse
    该配置能够指定持久化时所使用的序列化方法,以及恢复 Store 时的反序列化方法。另外,必须具有 serialize: (value: StateTree) => string 和 deserialize: (value: string) => StateTree 方法。
  • beforeRestore
    类型:(context: PiniaPluginContext) => void
    默认值:undefined
    该 hook 将在从 storage 中恢复数据之前触发,并且它可以访问整个 PiniaPluginContext,这可用于在恢复数据之前强制地执行特定的操作。
  • afterRestore
    类型:(context: PiniaPluginContext) => void
    默认值:undefined
    该 hook 将在从 storage 中恢复数据之后触发,并且它可以访问整个 PiniaPluginContext,这可用于在恢复数据之后强制地执行特定的操作
  • debug
    类型:boolean
    默认值:false
    当设置为 true 时,持久化/恢复 Store 时可能发生的任何错误都将使用 console.error 输出

例子

/*
 * @Date: 2022-11-30 17:26:39
 * @LastEditors: zhangsk
 * @LastEditTime: 2023-04-14 11:26:46
 * @FilePath: \basic-demo\src\store\index.ts
 * @Label: Do not edit
 */
import { defineStore } from 'pinia'

export const useStore = defineStore('main', {
  //  类似data
  state: () => {
    return {
      userInfo: localStorage.getItem('userInfo') ? JSON.parse(localStorage.getItem('userInfo') as string) : undefined,
      token: undefined as string | undefined,
      num: 1,
    }
  },
  //  类似计算属性
  getters: {
    getNum2: (state) => state.num * 2
  },
  // 类似methods
  actions: {
    setUserInfo(info = null) {
      this.userInfo = info || undefined
      console.log(info);

      localStorage.setItem('userInfo', JSON.stringify(info))
    }
  },
  persist: {
    paths: ['num'],
    storage: sessionStorage,
    key: 'my_num'
  }
})


在这里插入图片描述
【注意】这个持久化存储是自动存储的,什么时机呢?在你使用store的时候。

选择性持久化数据

大部分时候 ,store里的数据只需要存储一部分数据。
persist 还接受一个数组。可以选择性的存储部分数据

import { defineStore } from 'pinia'

defineStore('store', {
  state: () => ({
    toLocal: '',
    toSession: '',
    toNowhere: '',
  }),
  persist: [
    {
      paths: ['toLocal'],
      storage: localStorage,
    },
    {
      paths: ['toSession'],
      storage: sessionStorage,
    },
  ],
})

示例:

/*
 * @Date: 2022-11-30 17:26:39
 * @LastEditors: zhangsk
 * @LastEditTime: 2023-04-14 13:42:52
 * @FilePath: \basic-demo\src\store\index.ts
 * @Label: Do not edit
 */
import { defineStore } from 'pinia'

export const useStore = defineStore('main', {
  //  类似data
  state: () => {
    return {
      userInfo: localStorage.getItem('userInfo') ? JSON.parse(localStorage.getItem('userInfo') as string) : undefined,
      token: 'aaxswkjaoksjdohasdh' as string | undefined,
      num: 1,
    }
  },
  //  类似计算属性
  getters: {
    getNum2: (state) => state.num * 2
  },
  // 类似methods
  actions: {
    setUserInfo(info = null) {
      this.userInfo = info || undefined
      console.log(info);

      localStorage.setItem('userInfo', JSON.stringify(info))
    }
  },
  persist: [
    {
      paths: ['num'],
      storage: sessionStorage,
      key: 'my_num'
    },
    {
      paths: ['token'],
      key: 'token',
      storage: localStorage
    },
  ]
})


在这里插入图片描述

注意

由于数据将会被序列化,因此非基本类型(如 Date)不会以 Date 对象形式存储,而是作为 string。
当提供自定义 storage 时,其方法必须是同步的,这是因为 Pinia 的状态订阅($subscribe)是同步的(与 mutations 一致)。

结语

结束了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/425830.html

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

相关文章

使用PDF猫怎么将PNG图片转化成JPG格式图片?

如需了解更多办公应用的相关教程,可到赛效官方网站的应用资讯栏目或者应用问答栏目下查看更多。 TXT文本工具是微软操作系统上附带的一种文本格式,打开速度比较快,且记录文字内容时比较便捷且快速,但是很多时候记录成TXT文本的工…

八大排序算法(冒泡排序、快速排序、堆排序.....)

每坚持一天,offer就会离我更近一步🌹 文章目录冒泡排序选择排序插入排序希尔排序快速排序计数排序堆排序归并排序冒泡排序 算法描述:从第一个元素开始,两两比较,如果前者比后者大,那么就将两者进行交换&am…

[oeasy]python0133_[趣味拓展]颜文字_流石兄弟_表情文字_2ch_kaomoji

颜文字 回忆上次内容 上次我们了解unicode 里面有各种字体 甚至还有emoji emoji 本质上也是文字 按照unicode的方式编码存储时按照utf-8的方式编码显示时按照系统定义的方式进行显示 还有什么好玩的亚文化吗?🤔 emoticon 1982 年 9 月 19 日 诞生了第…

docker安装rabbitmq的延迟队列插件

1.进入rabbitmq镜像 docker exec -it rabbitmq bash2.查看rabbitmq版本号,方便查找对应版本的延迟队列插件 rabbitmqctl version2.查询rabbitmq插件列表 rabbitmq-plugins list若没有rabbitmq_delayed_message_exchange-xxx.ez,则可以去[延迟队列插件…

win11家庭版 使用vm进行虚拟化的设置(此平台不支持虚拟化的 Intel VT-x/EPT。)

一、安装vm,进入BIOS设置虚拟化(vm安装16.2以上版本) 这个网上很多,就不说了 二、此时安装vm,创建虚拟机就没问题了,但是想继续再虚拟化,将会有一个问题“此平台不支持虚拟化的 Intel VT-x/EPT。” (很多…

中移链系统合约管控功能介绍

中移链是在满足我国信息化监管需求、合规可控的前提下,打造的中国移动区块链服务平台。如果把中移链类比为计算机系统,那么系统合约就是中移链中的系统设置部分,用于配置和管理链的资源和行为。在计算机系统中,系统设置提供了对计算机系统的底…

SE11/SM30 维护视图

文章目录创建维护视图偶遇错误创建维护视图 首先我们现在SE11中创建一个透明表,然后点击如下图 需要我们创建一个函数组,他的目的是为了让系统生成相应的代码放在这个函数组中,也可以说是SM30的操作界面;点击上面的保存就可以了 注意在输入屏幕编号的时候切记不要和其他的维护…

ChatGPT背后的逻辑

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl OpenAI与ChatGPT OpenAI是一个美国的人工智能(AI)研究实验室,由非营利组织OpenAI Incorporated和其盈利子公司OpenAI Limited Partnersh…

HTTPS 加密简析

1 前言 HTTPS采用的是对称加密和非对称加密的混合加密方法。 密码学知识可以查看我的这篇博客 CISSP考试要求里的“应用密码学”内容辅助记忆趣味串讲_晓翔仔的博客-CSDN博客 2.HTTPS加密过程 https在建立链接时是非对称加密,建立链接后是对称加密。 步骤1 客户端…

初识掌控板2.0、官方拓展板和配套编程软件mpython

不是广告!!不是广告!! 一、掌控板2.0概览 掌控板又名掌上联网计算机,是一款为青少年学习Python编程和创意制造,特别是物联网应用而设计的开源硬件。内置microPython开源嵌入式Python运行环境,可…

怎么将静图变动图?用这个网站就够了

在使用聊天工具聊天时,大家都喜欢用一些动态的表情包,这种动态表情包就是gif格式图片。因为其生动丰富的画面能够通过一张图片表达多种信息。那么,如何生成gif图片呢?一、什么工具能够制作gif动画? GIF中文网作为一款…

allwinner boot0启动

目录 路径:u-boot-2018/arch/arm/cpu/armv7/sunxi/u-boot-spl.lds 路径:u-boot-2018/arch/arm/cpu/armv7/start.S 路径:u-boot-2018/arch/arm/lib/crt0.S 路径:u-boot-2014.07\common\board_f.c 路径:u-boot-2014.…

领英如何不让对方查看自己的好友,防止他人添加自己客户

那如何防止好友加自己的好友呢?其实领英是可以设置谁能查看到自己好友的,甚至不让所有人查看。 领英是一个关系性的职业社交平台,最大的特点就是关系性。彼此有某种关系的人或在3度内的人都可以查看对方的详细资料,甚至可添加对方…

Redis 如何配置读写分离架构(主从复制)?

文章目录Redis 如何配置读写分离架构(主从复制)?什么是 Redis 主从复制?如何配置主从复制架构?配置环境安装 Redis 步骤通过命令行配置从节点通过配置文件配置从节点Redis 主从复制优点Redis 主从复制缺点Redis 如何配…

第十四届蓝桥杯单片机省赛真题(巨简代码+超级详解)

文章目录前言一、陷阱分析二、代码相关定义、声明1.变量声明2.函数声明三、主要函数1.函数初始化 :关闭蜂鸣器、定时器初始化、设置时间、消除85℃影响、开启总中断2.按键扫描:长按松开清除数据,短按切换界面,加减参数3.数据采集与…

视频提取gif如何操作?教你用gif制作工具快速截取gif

从视频中提取gif动画就是将电影、电视剧中的某一段视频提取出来做成gif格式的动态图片。那么,如何使用电脑或是手机来将视频转换成gif动图呢? 一、使用什么工具能够完成视频转gif制作呢? 通过使用GIF中文网的视频转gif(https://…

S型加减速速度给定功能块(SCL+梯形图)

S型加减速详细算法公式请参看下面博客文章,这里不再赘述: 博途PLC1200/1500PLC S型速度曲线变频器控制应用(SCL完整源代码)_RXXW_Dor的博客-CSDN博客PLC运动控制基础系列之梯形速度曲线,可以参看下面这篇博客:PLC运动控制基础系列之梯形速度曲线_RXXW_Dor的博客-CSDN博客运…

前段开发:配置VSCode像IDEA一样调试VUE项目

如果不配置VSCode调试,那么我们的前段项目一般都是在浏览器中的开发者工具中调试,这样对于使用习惯了IDEA开发调试的人特别不习惯,这几天个人研究了下VSCode中的代码调试功能,做以下记录: 1、使用插件调试&#xff1a…

应用DAP-seq技术鉴定百脉根中一个NAC转录因子在全基因上的靶基因,揭示硝酸盐诱导根瘤衰老的新机制

豆科植物通过与根瘤菌共生,形成能够固氮的根瘤。硝酸盐能够影响根瘤共生的过程,适宜浓度的硝酸盐促进结瘤固氮,而高浓度的硝酸盐抑制菌根共生,并且会促进根瘤衰老。NLP (NIN-Like Protein)转录因子调控硝酸盐信号转导,…

CSS实现三角形的四种方法

方法一&#xff1a;使用 border (常见) 【解释】不设置宽高&#xff0c;用边框大小控制三角型大小 【分解步骤】 设置一个div不设宽高 【示例】 <style>#triangle{width: 0;height: 0;border: 100px solid;border-color: orangered skyblue gold yellowgreen;} </s…