Pinia的持久化存储pinia-plugin-persistedstate

piniavuex 一样,数据是短时的,只要一刷新页面,数据就会恢复成初始状态,为了避免这个问题,可以对其采用持久化保存方法

使用官方推荐的插件去实现持久化存储,这样更便捷,省时省力。之前官方推荐的插件为 pinia-plugin-persist现在官方推荐的插件为 pinia-plugin-persistedstate当然,实现持久化存储的插件肯定不止这一种,想用别的也可以

1. 安装插件

安装 pinia-plugin-persistedstate

js 复制代码
yarn add pinia-plugin-persistedstate
# 或者使用 npm
npm install pinia-plugin-persistedstate

2. 引入插件

main.ts 中引入

引入 pinia-plugin-persistedstate

js 复制代码
import { createApp } from 'vue'
import App from './App.vue'
import { createPinia } from 'pinia'

// 下面这3行
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
const pinia = createPinia()
pinia.use(piniaPluginPersistedstate)

createApp(App).use(pinia).mount('#app')

3、所有 Store 都默认开启持久化存储

该配置将会使所有 Store 持久化存储,且必须配置 persist: false 显式禁用持久化

js 复制代码
import { createApp } from 'vue'
import App from './App.vue'
import { createPinia } from 'pinia'
import { createPersistedState } from 'pinia-plugin-persistedstate' // 这里

const pinia = createPinia()

pinia.use(
  // 这里
  createPersistedState({
    auto: true,
  })
)
createApp(App).use(pinia).mount('#app')

某一个store文件的基本写法

js 复制代码
import { defineStore } from 'pinia'

defineStore('persisted', {
  state: () => ({ saved: '' }),
})

上述例子中,store 将使用默认配置(或者已有的全局配置)进行持久化存储。

js 复制代码
import { defineStore } from 'pinia'

defineStore('not-persisted', {
  state: () => ({ saved: '' }),
  persist: false, // 这个store不需要持久化存储,
})

上述例子中,如果所有 Store 都默认开启持久化存储了,但是上述例子中的store不需要存储化了,那就可以单独为上述例子中 Store 设置是否持久化

4. 使用插件

方式1:默认保存

下面这种写法会将当前模块中的所有数据都进行持久化保存,默认保存在 localStorage中, key 为模块 id,刷新页面不需要手动读取数据,插件会自动读取

store/user.ts

js 复制代码
import { defineStore } from 'pinia'

export const useUserStore = defineStore('user', {
  state: () => ({
    name: null,
    age: null,
    sex: null,
  }),
  
  persist: true, // true 表示开启持久化保存
})

方式2:设置 key 、指定保存内容

你可以主动设置 key 名,也可以指定哪些数据保存,默认会保存当前模块全部数据。

store/user.ts

js 复制代码
export const useUserStore = defineStore('storeUser', {
  state: () => ({
    name: null,
    age: null,
    sex: null,
    save: { 
        me: 'saved',
        notMe: 'not-saved',
    },
  }),
  
  persist: { 
      key: 'storeUser', 
      paths: ['save.me', 'saveMeToo'],
  },
})

该 store 中, 数据将被持久化存储在 localStorage 中的 storeUser key 中。同时只有 save.mename 被持久化,而其他的state不会被持久化。

你甚至可以对不同数据设置不同的本地存储方式

store/user.ts

js 复制代码
export const useUserStore = defineStore('storeUser', {
  state: () => ({
    name: null,
    age: null,
    sex: null,
  }),
  
  persist: [  
    {  
      paths: ['name'],  
      storage: localStorage,  
    },  
    {  
      paths: ['age'],  
      storage: sessionStorage,  
    },  
  ]
  
})

上述例子中, name 的值将保存在 localStorage 中,而 age 的值将保留在 sessionStorage 中,sex 则不会持久化。

保存到 cookie 中当然也是可以的,不过需要手动添加 cookie 的保存方式,同样,此处也是推荐使用插件 js-cookie 来完成

js 复制代码
npm install js-cookie

store/user.ts

js 复制代码
import Cookies from 'js-cookie'

// 手动添加cookie
const cookiesStorage: Storage = {
  setItem (key, state) {
    // 设置有效期 3 天,不设置默认同 sessionStorage 有效期一致
    return Cookies.set(key, state.accessToken, { expires: 3 }) 
  },
  getItem (key) {
    return JSON.stringify({
      accessToken: Cookies.get(key),
    })
  },
}

export const useUserStore = defineStore('storeUser', {
  state: () => ({
    name: null,
    age: null,
    sex: null,
    accessToken: 'xxxxxxxxx',
  }),
  persist: {
    storage: cookiesStorage, // 使用手动添加的cookie
    paths: ['accessToken'] // cookie 一般用来保存 token
  },
})
相关推荐
y先森15 分钟前
CSS3中的伸缩盒模型(弹性盒子、弹性布局)之伸缩容器、伸缩项目、主轴方向、主轴换行方式、复合属性flex-flow
前端·css·css3
前端Hardy15 分钟前
纯HTML&CSS实现3D旋转地球
前端·javascript·css·3d·html
susu108301891118 分钟前
vue3中父div设置display flex,2个子div重叠
前端·javascript·vue.js
IT女孩儿1 小时前
CSS查缺补漏(补充上一条)
前端·css
吃杠碰小鸡2 小时前
commitlint校验git提交信息
前端
虾球xz3 小时前
游戏引擎学习第20天
前端·学习·游戏引擎
我爱李星璇3 小时前
HTML常用表格与标签
前端·html
疯狂的沙粒3 小时前
如何在Vue项目中应用TypeScript?应该注意那些点?
前端·vue.js·typescript
小镇程序员3 小时前
vue2 src_Todolist全局总线事件版本
前端·javascript·vue.js
野槐3 小时前
前端图像处理(一)
前端