当前位置: 首页 > news >正文

Pinia 及其持久化插件的完整使用指南

Pinia 是 Vue 官方推荐的状态管理库,比 Vuex 更简单、更符合组合式 API 的设计理念。结合持久化插件可以实现状态数据的本地存储。

一、安装 Pinia 及其持久化插件

首先需要安装必要的依赖包:

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

二、基本配置

1. 在 main.js/ts 中配置 Pinia

import { createApp } from 'vue'
import { createPinia } from 'pinia'
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
import App from './App.vue'

// 创建 Pinia 实例
const pinia = createPinia()
// 使用持久化插件
pinia.use(piniaPluginPersistedstate)

const app = createApp(App)

// 将 Pinia 挂载到 Vue 应用
app.use(pinia)
app.mount('#app')

2. 创建 Store

在 stores 目录下创建你的 Store 文件,例如 userStore.js

import { defineStore } from 'pinia'
import { ref, computed } from 'vue'

export const useUserStore = defineStore('user', () => {
  // 状态
  const token = ref('')
  const userInfo = ref(null)
  
  // getters
  const isLogin = computed(() => !!token.value)
  
  // actions
  const login = async (credentials) => {
    // 这里应该是你的登录API调用
    const res = await api.login(credentials)
    token.value = res.token
    userInfo.value = res.user
  }
  
  const logout = () => {
    token.value = ''
    userInfo.value = null
  }
  
  return {
    token,
    userInfo,
    isLogin,
    login,
    logout
  }
}, {
  persist: true // 启用持久化
})

三、在组件中使用 Store

1. 基本使用

<script setup>
import { useUserStore } from '@/stores/user'

const userStore = useUserStore()
</script>

<template>
  <div v-if="userStore.isLogin">
    欢迎,{{ userStore.userInfo.name }}
    <button @click="userStore.logout">退出登录</button>
  </div>
  <div v-else>
    <button @click="userStore.login({username: 'admin', password: '123456'})">
      登录
    </button>
  </div>
</template>

2. 使用 storeToRefs 解构

注意:storeToRefs 只能解构出状态(变量)和计算属性,而不能解构出方法
          如果需要解构方法,直接用例如  let {getList,onDelete}=userStore()  解构且它只能解构方法

<script setup>
import { storeToRefs } from 'pinia'
import { useUserStore } from '@/stores/user'

const userStore = useUserStore()
// 使用 storeToRefs 解构保持响应式
const { token, userInfo, isLogin } = storeToRefs(userStore)
</script>

四、持久化配置详解(可选)

1. 基本配置

{
  persist: {
    key: 'user', // 存储的键名,默认为 store 的 id
    storage: localStorage, // 存储位置,默认为 localStorage
    paths: ['token', 'userInfo'], // 指定要持久化的状态,默认全部
    serializer: { // 序列化配置
      serialize: JSON.stringify,
      deserialize: JSON.parse
    }
  }
}

2. 自定义存储键名

{
  persist: {
    key: 'my-app-user' // 自定义存储键名
  }
}

3. 部分状态持久化

{
  persist: {
    paths: ['token'] // 只持久化 token
  }
}

4. 使用 sessionStorage

{
  persist: {
    storage: sessionStorage // 使用 sessionStorage 替代 localStorage
  }
}

5. 自定义序列化(如加密)

import { encrypt, decrypt } from '@/utils/crypto'

{
  persist: {
    serializer: {
      serialize: (value) => encrypt(JSON.stringify(value)),
      deserialize: (value) => JSON.parse(decrypt(value))
    }
  }
}

6. 多存储方式组合

{
  persist: [
    {
      key: 'user-info',
      paths: ['userInfo'],
      storage: localStorage
    },
    {
      key: 'user-token',
      paths: ['token'],
      storage: sessionStorage
    }
  ]
}

推荐使用持久化的场景

1. 用户身份认证
// userStore.js
export const useUserStore = defineStore('user', () => {
  const token = ref('')
  return { token }
}, {
  persist: true // 保持登录状态
})
  • 作用:避免用户刷新页面后需要重新登录。

2. 购物车/草稿数据
// cartStore.js
persist: {
  paths: ['items'], // 仅持久化商品列表
  storage: sessionStorage // 会话级存储
}
  • 作用:防止意外关闭页面导致数据丢失。

3. UI 偏好设置
// settingsStore.js
persist: {
  key: 'app-settings', // 自定义键名
  paths: ['theme', 'language'] // 主题和语言设置
}
  • 作用:记住用户的主题、语言等偏好。

五、高级用法

1. 跨 Store 调用

import { defineStore } from 'pinia'
import { useUserStore } from './userStore'

export const useCartStore = defineStore('cart', () => {
  const userStore = useUserStore()
  
  const cartItems = ref([])
  
  const loadCart = async () => {
    if (userStore.isLogin) {
      // 调用 API 获取购物车数据
      cartItems.value = await api.getCart(userStore.token)
    }
  }
  
  return { cartItems, loadCart }
}, {
  persist: true
})

2. 重置 Store 状态

const userStore = useUserStore()
// 重置为初始状态
userStore.$reset()

3. 订阅状态变化

userStore.$subscribe((mutation, state) => {
  // 当状态变化时执行
  console.log('状态变化:', mutation, state)
})

相关文章:

  • 烟台企业做网站推广网站源码
  • 北京做百度网站推广拉新任务的平台
  • 自己做一个网站一年的费用深圳网站优化培训
  • 网站开发对算法有要求么深圳疫情防控最新消息
  • 上海知名的网站建设公优化精灵
  • 成都旅游几月份去最佳时间福州seo快速排名软件
  • 食物链 POJ - 1182分析与解答
  • QtAdvancedStylesheets使用
  • 论坛系统自动化测试报告
  • ARM向量表
  • Python使用“决策树”算法解决预测钻石成本的问题
  • Flink内存模型--flink1.19.1
  • 自定义一些C语言的字符串函数
  • Go语言基础:数据类型
  • Redis-07.Redis常用命令-集合操作命令
  • Python爬虫-爬取大麦网演出详情页面数据
  • 0330-YYYY-MM-DD格式日期比较大小
  • 【JavaScript】十二、定时器
  • SpringBoot 配置⽂件
  • 练习题:113
  • 从零开始:用Python搭建你的第一个机器学习模型
  • 划分型dp+倍率转换为后缀
  • VMware+Ubuntu+VScode+ROS一站式教学+常见问题解决
  • SpringBoot集成Log4j2终极指南:从基础配置到性能调优
  • 线性回归算法
  • YOLOv11模型的常见处理