【uni-app】Pinia 持久化

小程序端 Pinia 持久化

说明:Pinia 用法与 Vue3 项目完全一致,uni-app 项目仅需解决持久化插件兼容性问题。

持久化存储插件

安装持久化存储插件: pinia-plugin-persistedstate

复制代码
pnpm i pinia-plugin-persistedstate

插件默认使用 localStorage 实现持久化,小程序端不兼容,需要替换持久化 API。

基本用法

ts 复制代码
import { defineStore } from 'pinia'
import { ref } from 'vue'
​
// 定义 Store
export const useMemberStore = defineStore(
  'member',
  () => {
    // 会员信息
    const profile = ref<any>()
​
    // 保存会员信息,登录时使用
    const setProfile = (val: any) => {
      profile.value = val
    }
​
    // 清理会员信息,退出时使用
    const clearProfile = () => {
      profile.value = undefined
    }
​
    // 记得 return
    return {
      profile,
      setProfile,
      clearProfile,
    }
  },
  // TODO: 持久化
  {
    // 网页端的配置
    // persist: true,
    // 小程序端的配置
    persist: {
      storage: {
        getItem: (key: string) => uni.getStorageSync(key),
        setItem: (key: string, value: string) => uni.setStorageSync(key, value)
      },
    },
  },
)
复制代码
// src/stores/index.ts
import { createPinia } from 'pinia'
import persist from 'pinia-plugin-persistedstate'
​
// 创建 pinia 实例
const pinia = createPinia()
// 使用持久化存储插件
pinia.use(persist)
​
// 默认导出,给 main.ts 使用
export default pinia
​
// 模块统一导出
export * from './modules/member'

// main.ts
import { createSSRApp } from 'vue'
import pinia from './stores'
​
import App from './App.vue'
export function createApp() {
  const app = createSSRApp(App)
​
  app.use(pinia)
  return {
    app,
  }
}

多端兼容

网页端持久化 API

复制代码
// 网页端API
localStorage.setItem()
localStorage.getItem()

多端持久化 API

复制代码
// 兼容多端API
uni.setStorageSync()
uni.getStorageSync()

原理

可以看到 persist 默认接收一个 boolean。表示是否开启持久化,而且默认持久化网页端。

此时我们是小程序端,就需要在 storage 中进行配置持久化的地方。

这里接收两个配置项 getItem 和 setItem,代表持久化的 setter 和 getter。

Configuration | pinia-plugin-persistedstate (prazdevs.github.io)

相关推荐
iOS阿玮10 小时前
永远不要站在用户的对立面,挑战大众的公知。
uni-app·app·apple
huabuyu10 小时前
基于 React + MarkdownIt 的 Markdown 渲染器实践:支持地图标签和长按复制
前端
芦苇Z10 小时前
HTML <a> 标签的 rel 属性全解析:安全、隐私与 SEO 最佳实践
前端·html
在这儿不行10 小时前
Android 15边到边模式
前端
源猿人10 小时前
企业级文件浏览系统的Vue实现:架构设计与最佳实践
前端·javascript·数据可视化
红红大虾10 小时前
Defold引擎中关于CollectionProxy的使用
前端·游戏开发
最后一个农民工10 小时前
vue3实现仿豆包模版式智能输入框
前端·vue.js
xw511 小时前
uni-app中v-if使用”异常”
前端·uni-app
!win !11 小时前
uni-app中v-if使用”异常”
前端·uni-app