pinia持久化和数据加密处理

引言

vue3现在比较常用的状态管理是pinia,和vuex一样,我们在某些场合下也需要对状态持久化。本文将讨论这个话题。

持久化的实现

要实现pinia的持久化,我们肯定要像vuex一样引入一个插件,这个插件就是pinia-plugin-persistedstate,官方文档在此

你可以直接通过以下其中一个命令安装

csharp 复制代码
npm i pinia-plugin-persistedstate -S
yarn add pinia-plugin-persistedstate
pnpm add pinia-plugin-persistedstate -S

并将该插件添加到你的pinia

javascript 复制代码
import { createPinia } from 'pinia'
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
​
const pinia = createPinia()
pinia.use(piniaPluginPersistedstate)

插件的基本使用

参考官方文档,你可以直接在需要持久化的store中的state配置后设置persist:true

此外,persist还可以是一个对象,它接收如下的参数:

具体用法实例参考文档或注释说明。

特别需要说明的,如果只需要局部字段的持久化,我们可以使用配置中的paths属性来实现。例如

css 复制代码
state:()=>({
    username:'admin',
    nickname:"管理员",
    token:"",
    role:"admin"
})

我们只需要对username和nickname持久化,其它字段不需要,我们可以通过

css 复制代码
persist:{
    paths:['username','nickname']
}

paths中还支持字段路径配置,如文档所示的save.me

css 复制代码
import { defineStore } from 'pinia'
​
export const useStore = defineStore('store', {
  state: () => ({
    save: {
      me: 'saved',
      notMe: 'not-saved',
    },
    saveMeToo: 'saved',
  }),
  persist: {
    paths: ['save.me', 'saveMeToo'],
  },
})

持久化数据加密处理

数据持久化之后我们还得考虑数据是否要加密,就像上文的role字段很明显是用于用户角色控制的,不加密处理就可以通过F12修改,功能就白做了。为此,引入了secure-ls

其可以指定对我们存入LocalStorage的字段选择合适的加密算法(通过配置中的encodingType指定)将存入LocalStorage的数据加密。

配合pinia-plugin-persistedstate使用的话,我们可以先定义一个"类Storage"。

typescript 复制代码
import type { StorageLike } from 'pinia-plugin-persistedstate'
import SecureLS from 'secure-ls'
const ls = new SecureLS({
  isCompression: false, //不压缩
  //自定义秘钥
  encryptionSecret: 'ddddgxxx'
})
​
export const SelfStorage: StorageLike = {
  setItem(key: string, value: string) {
    ls.set(key, value)
  },
  getItem(key: string): string | null {
    return ls.get(key)
  }
}

之所以可以这样,其实也是pinia-plugin-persistedstate的配置项中的storage?: StorageLike;storage的类型是StorageLike,其类型定义如下:

ini 复制代码
type StorageLike = Pick<Storage, 'getItem' | 'setItem'>;

由此,可以大概知道,pinia-plugin-persistedstate最终调用的是给定StoragesetItemgetItem方法,只要我们自定义的Storage实现了这两个方法,我们甚至可以把全局状态存储在cookie设置是webSql中!对于我们需要加密这个需求,secure-ls更方便一些,因此文中选择了它。

总结

我们要想对pinia的全局状态持久化,可以选择使用插件pinia-plugin-persistedstate;而要想对这些状态数据进一步加密处理,我们可以通过自定义Storage(类似于后端中的接口实现)来结合一些加密库,例如secure-ls来实现。

相关推荐
qq_177767379 小时前
React Native鸿蒙跨平台实现应用介绍页,实现了应用信息卡片展示、特色功能网格布局、权限/联系信息陈列、评分展示、模态框详情交互等通用场景
javascript·react native·react.js·ecmascript·交互·harmonyos
2603_949462109 小时前
Flutter for OpenHarmony社团管理App实战:预算管理实现
android·javascript·flutter
wuhen_n9 小时前
JavaScript内存管理与执行上下文
前端·javascript
Hi_kenyon10 小时前
理解vue中的ref
前端·javascript·vue.js
jin12332211 小时前
基于React Native鸿蒙跨平台地址管理是许多电商、外卖、物流等应用的重要功能模块,实现了地址的添加、编辑、删除和设置默认等功能
javascript·react native·react.js·ecmascript·harmonyos
2501_9209317011 小时前
React Native鸿蒙跨平台医疗健康类的血压记录,包括收缩压、舒张压、心率、日期、时间、备注和状态
javascript·react native·react.js·ecmascript·harmonyos
橙露12 小时前
React Hooks 深度解析:从基础使用到自定义 Hooks 的封装技巧
javascript·react.js·ecmascript
2501_9209317012 小时前
React Native鸿蒙跨平台使用useState管理健康记录和过滤状态,支持多种健康数据类型(血压、体重等)并实现按类型过滤功能
javascript·react native·react.js·ecmascript·harmonyos
Ulyanov12 小时前
从静态到沉浸:打造惊艳的Web技术发展历程3D时间轴
前端·javascript·html5·gui开发
VT.馒头13 小时前
【力扣】2625. 扁平化嵌套数组
前端·javascript·算法·leetcode·职场和发展·typescript