当前位置: 代码网 > it编程>编程语言>Javascript > Vue3+Vite项目中引入pinia和pinia-plugin-persistedstate的方法代码

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

2024年11月25日 Javascript 我要评论
一、pinia1. 简介pinia 是 vue.js 官方推荐的状态管理库,是 vuex 的轻量替代品,设计更简单、功能更强大,并且支持模块化和 typescript。2. pinia 的主要特点简单

一、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内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com