Vue3+Vite项目中引入pinia和pinia-plugin-persistedstate的方法代码

 更新时间:2024年11月22日 08:27:05   作者:九月儿  
这篇文章主要给大家介绍了关于Vue3+Vite项目中引入pinia和pinia-plugin-persistedstate的相关资料,Pinia是Vue.js的官方状态管理库,轻量且功能强大,支持模块化和TypeScript,PiniaPluginPersistedState是一个插件,需要的朋友可以参考下

一、Pinia

1. 简介

Pinia 是 Vue.js 官方推荐的状态管理库,是 Vuex 的轻量替代品,设计更简单、功能更强大,并且支持模块化和 TypeScript。

2. Pinia 的主要特点

  • 简单易用:

    API 设计直观,与 Vue Composition API 深度结合。

  • 支持模块化:

    每个 store 独立管理,减少全局 store 复杂性。

  • 热更新:

    支持 HMR(Hot Module Replacement),开发时无需手动刷新。

  • 支持 TypeScript:

    提供更好的类型推导和代码提示。

  • 无依赖:

    不需要额外的插件或中间件,集成更轻松。

二、Pinia Plugin PersistedState

1. 简介

pinia-plugin-persistedstate 是 Pinia 的一个插件,用于持久化存储状态。它将 store 的状态保存在 localStorage 或 sessionStorage 中,即使页面刷新或关闭后再次打开,状态依然会被恢复。

2. 插件特点

  • 支持存储到 localStorage 或 sessionStorage。
  • 可选择性持久化某些 store 或字段。
  • 集成简单,自动同步状态。
  • 支持自定义序列化(如 JSON)和反序列化逻辑。

3. PersistedState 配置项

persist 字段用于配置持久化存储的策略。

常见配置项

配置项类型默认值描述
enabledbooleanfalse是否启用持久化存储。
keystringStore 名称存储在 Storage 中的键名。
storageStoragelocalStorage存储方式,可选 localStorage 或 sessionStorage。
pathsstring[]undefined选择性持久化某些字段(不设置则默认存储全部)。
serializerobject内置 JSON 序列化器自定义序列化器,包括 serialize 和 deserialize。

4. 示例:选择性持久化字段

如果只想持久化 name 字段:

persist: {
  enabled: true,
  strategies: [
    {
      key: 'user',
      storage: localStorage,
      paths: ['name'], // 只持久化 `name`
    },
  ],
},

5. 示例:自定义序列化器

如果需要自定义存储格式(如 Base64):

persist: {
  enabled: true,
  strategies: [
    {
      key: 'user',
      storage: sessionStorage,
      serializer: {
        serialize: (value) => btoa(JSON.stringify(value)), // Base64 编码
        deserialize: (value) => JSON.parse(atob(value)),  // Base64 解码
      },
    },
  ],
},

三、如何在项目中使用 Pinia 和 PersistedState

1. 安装 Pinia 和 PersistedState 插件

npm install pinia pinia-plugin-persistedstate

2. 配置 Pinia

在项目的入口文件(如 main.ts 或 main.js)中:

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

const app = createApp(App);

// 创建 Pinia 实例
const pinia = createPinia();

// 使用持久化插件
pinia.use(piniaPluginPersistedState);

app.use(pinia);
app.mount('#app');

3. 创建 Store

创建一个持久化的 Pinia store,例如 src/stores/user.ts:

import { defineStore } from 'pinia';

export const useUserStore = defineStore('user', () => {
  const name = ref('王强')
  const age = ref(25)
  function setName(name: string) {
	name.value = name
  }
  return {
  	name,
  	age,
  	setName
  }
}, 
  {
    persist: {
      storage: sessionStorage
    }
  }
)

4. 使用 Store

1. 读取

<template>
  <div>
    <p>用户名:{{ userStore.name }}</p>
    <button @click="updateName">修改用户名</button>
  </div>
</template>

<script lang="ts" setup>
import { useUserStore } from '@/stores/user';
const userStore = useUserStore();

const updateName = () => {
  userStore.setName('张三');
};
</script>

2. 更新

// 直接修改
userStore.name = '张三'

// 通过 $patch({}) 批量对象修改
userStore.$patch({
 name: '张三',
 age:19
})

// 通过 $patch((state) => {}) 回调函数修改
userStore.$patch((state) => {
    state.name = '张三'
    state.age = 19
})

// 通过 action 修改
userStore.setName('张三');

3. 重置

将 store 中 state 重置为初始值

userStore.$reset()

4. 解构 storeToRefs

解构会丢失响应式,需要用 storeToRefs 转为响应式

import { storeToRefs } from 'pinia'
const userStore = useUsersStore()
const { name } = storeToRefs(userStore)

5. 监听 state 变化

监听state变化

/**
 * 当 state 中的值任意一个发生变化的时候,就会触发该函数
 * 
 * args: 里面会记录新旧值
 * state:就是当前操作的 state 的实例
 * options: 是一个对象,比如 detached,这是一个 boolean 参数,当这个参数为 true 时,表明即使当前组件销毁后,也继续监控 state 里面值的变化,可选
 */
 userStore.$subscribe((args, state) => {
  console.log('args', args)
  console.log('state', state)
},{
  detached: true
})

6. 监听 action 调用

当调用函数的时候,就会触发该函数

/**
 * 当调用 actions 里面的函数的时候,就会触发改函数
 *
 * args:接收参数,里面封装了多个 api:
 *      args.after:当 $onAction 里面的逻辑执行完成之后才会执行 args.after 函数逻辑,所以 args.after 放置的位置于执行顺序无关
 *      args.onError:当调用 actions 里面的函数发生错误时,args.onError 函数也会执行
 *      args.args:接收调用 actions 里面的函数传递的参数,是一个数组
 *      args.name:执行的 actions 里面的函数的名称
 * detached: 这是一个 boolean 参数,当这个参数为 true 时,表明即使当前组件销毁时,也继续监控 actions 里面的函数调用,可选
 */
userStore.$onAction((args) => {
    args.after(() => console.log("args.after", "===="));
    console.log("args", args);
}, true);

总结

到此这篇关于Vue3+Vite项目中引入pinia和pinia-plugin-persistedstate的文章就介绍到这了,更多相关Vue3+Vite引入pinia和pinia-plugin-persistedstate内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用vue3指令封装一个图片预览功能

    使用vue3指令封装一个图片预览功能

    这篇文章主要为大家详细介绍了如何使用 vue3 指令封装一个后台管理系统图片预览功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • vue使用canvas绘制圆环

    vue使用canvas绘制圆环

    这篇文章主要介绍了vue使用canvas绘制圆环,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • uniapp使用webview内嵌H5的注意事项详解

    uniapp使用webview内嵌H5的注意事项详解

    在移动应用开发中,uniApp框架提供了一种跨平台的解决方案,允许开发者使用一套代码来构建iOS、Android等多平台的应用,这篇文章主要给大家介绍了关于uniapp使用webview内嵌H5的注意事项,需要的朋友可以参考下
    2024-07-07
  • vue的指令和插值问题汇总

    vue的指令和插值问题汇总

    Vue 是一套用于构建用户界面的渐进式框架,Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合,这篇文章主要介绍了vue的指令和插值总结,需要的朋友可以参考下
    2022-10-10
  • Vue开发工具之vuejs-devtools安装教程及常见问题解决(最详细)

    Vue开发工具之vuejs-devtools安装教程及常见问题解决(最详细)

    这篇文章主要介绍了Vue开发工具vuejs-devtools超级详细安装教程以及常见问题解决本篇文章是最详细的vue开发工具vuejs-devtools安装教程,需要的朋友可以参考下
    2022-11-11
  • v-html渲染组件问题

    v-html渲染组件问题

    最近在学习vue,今天正好发现个问题,本文介绍了v-html渲染组件问题,整理了问题的解决方法,有需要的小伙伴可以参考下
    2021-05-05
  • Vue使用jsmind实现生成脑图的示例代码

    Vue使用jsmind实现生成脑图的示例代码

    这篇文章主要为大家详细介绍了Vue如何使用jsmind实现生成脑图,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下
    2024-03-03
  • 关于vue3 option api新玩法分享

    关于vue3 option api新玩法分享

    vue3新特性中最重要、内容最多的组合式api,组合式api既可以解决之前vue2开发的痛点,又提升了性能,下面这篇文章主要给大家介绍了关于vue3 option api新玩法的相关资料,需要的朋友可以参考下
    2022-06-06
  • Vue3初探之ref、reactive以及改变数组的值

    Vue3初探之ref、reactive以及改变数组的值

    在setup函数中,可以使用ref函数和reactive函数来创建响应式数据,下面这篇文章主要给大家介绍了关于Vue3初探之ref、reactive以及改变数组值的相关资料,需要的朋友可以参考下
    2022-09-09
  • vue3实现移动端滑动模块

    vue3实现移动端滑动模块

    这篇文章主要为大家详细介绍了vue3实现移动端滑动模块,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09

最新评论