vue状态管理器pinia、pinia-plugin-persist持久化储存

news2025/4/3 1:20:15

vue状态管理器pinia、pinia-plugin-persist持久化储存

          • 一、简介
          • 二、配置状态管理器,需安装pinia、pinia-plugin-persist
          • 三、定义store:defineStore
          • 五、pinia中的Getter
          • 六、pinia中的Action
          • 七、pinia-plugin-persist持久化储存配置

一、简介

Pinia 是一个基于 Vue 3 的状态管理库,旨在简化和优化 Vue 应用程序的状态管理。它提供了一种简单且强大的方式来管理应用程序的状态,并且与 Vue 3 的响应性系统紧密集成。
以下是 Pinia 的一些特点和优势:
1.基于 Vue 3:Pinia 是专为 Vue 3 设计的状态管理库,充分利用了 Vue 3 的 Composition API 和响应性系统。
2.类型安全:Pinia 支持 TypeScript,并且在状态管理过程中提供了类型检查和推断,帮助开发者避免潜在的类型错误。
3.简单易用:Pinia 的 API 设计简洁清晰,使得状态管理变得简单且易于理解,同时提供了强大的功能。
4.零依赖:Pinia 本身没有任何依赖,因此可以轻松集成到现有的 Vue 3 项目中。
5.插件化:Pinia 支持插件系统,可以轻松扩展和定制状态管理的功能。
6.Devtools 支持:Pinia 与 Vue Devtools 集成良好,可以方便地在开发过程中调试和监控状态的变化。

二、配置状态管理器,需安装pinia、pinia-plugin-persist

1.pinia.js

import { createPinia } from "pinia";
import piniaPersist from "pinia-plugin-persist";

const pinia = createPinia();
pinia.use(piniaPersist); //使用持久化插件

export default pinia;

2.useDemoStore.js

import {defineStore} from "pinia";

const demoStore = defineStore('demoStore', {
    state: () => ({
        userId: '213213',
        userName: '张三'
    }),
    actions: {//actions是store的方法methods
        updateState(info){
            this.$state = {
                ...this.$state,
                ...info
            }
        }
    },
    persist: {//pinia持久化配置,默认sessionStorage
        enabled: true
    }
});

export default demoStore

3.mian.js使用pinia插件

import { createApp } from "vue";
import App from "./App.vue";
import pinia from "@store/pinia.js";

const app = createApp(App);

app.use(pinia);


app.mount("#app");

4.使用store

<template>
  <button @click="onUpdateStore">更新store</button>
  <p>{{demoStore.userName}}</p>
</template>
<script setup>
import useDemoStore from "@store/useDemoStore.js";
const demoStore = useDemoStore();
const  onUpdateStore = ()=>{
  demoStore.updateState({userId: 'wqewqe', userName: '李四'})
}
</script>
三、定义store:defineStore

1.Option Store:defineStore(idid,options),options配置如下

  • id:用于在整个应用程序中标识存储的唯一字符串键,等同于参数id,options传id,参数id可不用传
  • state:创建新状态的函数。必须是箭头函数以确保正确的类型。
  • getters:可选的获取器对象,每个获取器函数都有一个state参数
  • actions:可选的操作对象
  • hydrate:允许在 SSR 期间对存储进行水合处理,当在存储定义中使用复杂状态(例如仅客户端引用)时,并且从 pinia.state 复制值不足以满足需求时。
  • options配置除了上述配置,还可配置插件的配置,如:pinia-plugin-persist持久化储存
import {defineStore} from "pinia";

const demoStore = defineStore('demoStore', {
    state: () => ({
        userId: '213213',
        userName: '张三'
    }),
    actions: {//actions是store的方法methods
        updateState(info){
            this.$state = {
                ...this.$state,
                ...info
            }
        }
    },
    persist: {//pinia持久化配置,默认sessionStorage
        enabled: true
    }
});

export default demoStore

2.Setup Store:defineStore(stoireName,setup,options),options配置如下:

  • actions:可选的操作对象
  • options配置除了上述配置,还可配置插件的配置,如:pinia-plugin-persist持久化储存
const demoStore = defineStore('counter', () => {
    const state = ref({
        userId: '213213',
        userName: '张三'
    });
    const updateState = (info) => {
        state.value = {
            ...state.value,
            ...info
        }
    }

    return {state, updateState}
},{
    persist: {//pinia持久化配置,默认sessionStorage
        enabled: true
    }
})

export default demoStore

3.defineStore除了会返回state、getters、actions等配置,还会返回以下属性:

  • store.$id:储存store的key
  • store.$state:state数据
  • store.$reset():重置store
  • store.$patch(state):更新store
  • store.$subscribe((mutation, state)=>{}):订阅store
  • store.$dispose():用于销毁存储实例并清理其内部状态。当你不再需要某个存储实例时,可以调用该方法来手动触发清理操作,以释放资源并避免内存泄漏
  • store.$onAction((store,name,args, after, onError)=>{}, detached):action监听器,当一个 action 即将被调用时,callback会触发,返回一个删除监听器的函数,detached组件销毁时是否保留监听器
    四、pinia中的State
    在 Pinia 中,state 是存储实例中保存数据的部分。它代表存储的状态,可以包含应用程序中需要共享和管理的数据。在定义 Pinia 存储时,可以通过 state 选项指定一个函数,该函数返回存储的初始状态。
    state 函数应该返回一个对象,该对象包含存储实例的初始状态数据。这些数据可以是任何类型,例如基本数据类型、对象、数组等。通过在 state 函数中返回这些数据,Pinia 将使用它们作为存储实例的初始状态,并在需要时对其进行响应式处理,以确保状态的变化能够正确地触发应用程序的重新渲染。
    通过在存储定义中设置 state,可以轻松地定义和管理存储实例的初始状态,从而构建具有响应式状态管理的应用程序。
    1.定义state,为了完整类型推理,推荐使用箭头函数
import { defineStore } from 'pinia'

const useStore = defineStore('storeId', {
  state: () => {
    return {
      // 所有这些属性都将自动推断出它们的类型
      count: 0,
      name: 'Eduardo',
      isAdmin: true,
      items: [],
      hasChanged: true,
    }
  },
})

2.访问 state,响应式访问state可使用storeToRefs,注意:使用storeToRefs时一定要解构,否则使用时,字符串会多出双引号

const store = useStore()

// count是响应式的 ref
// 同时通过插件添加的属性也会被提取为 ref
// 并且会跳过所有的 action 或非响应式 (不是 ref 或 reactive) 的属性
const {count} = storeToRefs(store());

store.count++

3.重置 state

const store = useStore()

store.$reset()

4.变更 state

const store = useStore()

store.$patch({
  count: store.count + 1,
  age: 120,
  name: 'DIO',
})

5.订阅 state

const store = useStore()
store.$subscribe((mutation, state) => {
  // import { MutationType } from 'pinia'
  mutation.type // 'direct' | 'patch object' | 'patch function'
  // 和 cartStore.$id 一样
  mutation.storeId // 'cart'
  // 只有 mutation.type === 'patch object'的情况下才可用
  mutation.payload // 传递给 cartStore.$patch() 的补丁对象。

  // 每当状态发生变化时,将整个 state 持久化到本地存储。
  localStorage.setItem('cart', JSON.stringify(state))
})
五、pinia中的Getter

在 Pinia 中,getter 是一种用于从存储实例中获取数据的方法。Getter 允许你定义一些计算属性,这些属性可以根据存储实例的状态数据进行计算,并返回相应的结果。通过使用 Getter,可以将一些复杂的逻辑封装在存储实例中,以便在需要时轻松获取计算得到的值。
在定义 Pinia 存储时,你可以通过 getters 选项指定一个包含 Getter 函数的对象。每个 Getter 函数都可以访问存储实例的状态数据,并根据需要执行计算。Getter 函数不会直接修改存储的状态,而是用于派生或计算新的数据。
通过使用 Getter,你可以在存储实例中实现一些复杂的数据逻辑,例如对状态数据进行过滤、排序、映射等操作,从而提供更丰富和灵活的数据访问方式。Getter 的值可以通过在组件中访问存储实例的方式来获取,从而实现对计算属性的使用和响应式更新。
1.定义Getter

export const useCounterStore = defineStore('counter', {
  state: () => ({
    count: 0,
  }),
  getters: {
    doubleCount: (state) => state.count * 2,
    doubleCountPlusOne() { ✨
      return this.doubleCount + 1
    },
  },
})

2.getter 传递参数,getter 是计算属性不能传递参数,可以从 getter 返回一个函数,该函数可以接受任意参数

export const useUserListStore = defineStore('userList', {
  getters: {
    getUserById: (state) => {
      return (userId) => state.users.find((user) => user.id === userId)
    },
  },
})

3.访问其他 store 的 getter,直接调用其他store使用getter即可

import { useOtherStore } from './other-store'

export const useStore = defineStore('main', {
  state: () => ({
    count: 0
  }),
  getters: {
    otherGetter(state) {
      const otherStore = useOtherStore()
      return state.localData + otherStore.data
    },
  },
})

六、pinia中的Action

在 Pinia 中,Action 是一种用于执行异步操作或对存储状态进行修改的方法。Actions 允许在存储实例中定义一些操作,这些操作可以触发状态的变化,并且可以包含异步逻辑,如网络请求、定时器等。通过使用 Actions,可以将数据修改逻辑封装在存储实例中,使应用程序的状态管理更加清晰和可维护。
在定义 Pinia 存储时,可以通过 actions 选项指定一个包含 Action 函数的对象。每个 Action 函数可以接受参数,并且通常会执行一些异步操作,如发起网络请求或执行耗时计算。在 Action 函数中,你可以访问存储实例的状态数据,并根据需要修改这些数据。
Actions 可以被组件调用,从而触发相应的操作。在 Action 函数中,可以通过调用 this 对象来访问存储实例的方法和属性,以便在操作中使用存储的状态数据,并在操作完成后更新状态。Actions 的执行是异步的,因此可以处理需要时间的操作,而不会阻塞应用程序的主线程。
通过使用 Actions,你可以将数据修改逻辑和异步操作集中在存储实例中,使得应用程序的状态管理更加模块化和可测试。
1.定义action

export const useCounterStore = defineStore('main', {
  state: () => ({
    count: 0,
  }),
  actions: {
    increment() {
      this.count++
    },
    randomizeCounter() {
      this.count = Math.round(100 * Math.random())
    },
  },
})

2.访问其他 store 的 action,同getter一样直接调用其他store使用action即可

import { useAuthStore } from './auth-store'

export const useSettingsStore = defineStore('settings', {
  state: () => ({
    preferences: null,

  }),
  actions: {
    async fetchUserPreferences() {
      const auth = useAuthStore()
      if (auth.isAuthenticated) {
        this.preferences = await fetchPreferences()
      } else {
        throw new Error('User must be authenticated')
      }
    },
  },
})

3.订阅 action

const unsubscribe = someStore.$onAction(
  ({
    name, // action 名称
    store, // store 实例,类似 `someStore`
    args, // 传递给 action 的参数数组
    after, // 在 action 返回或解决后的钩子
    onError, // action 抛出或拒绝的钩子
  }) => {
    // 为这个特定的 action 调用提供一个共享变量
    const startTime = Date.now()
    // 这将在执行 "store "的 action 之前触发。
    console.log(`Start "${name}" with params [${args.join(', ')}].`)


    // 这将在 action 成功并完全运行后触发。
    // 它等待着任何返回的 promise
    after((result) => {
      console.log(
        `Finished "${name}" after ${
          Date.now() - startTime
        }ms.\nResult: ${result}.`
      )
    })


    // 如果 action 抛出或返回一个拒绝的 promise,这将触发
    onError((error) => {
      console.warn(
        `Failed "${name}" after ${Date.now() - startTime}ms.\nError: ${error}.`
      )
    })
  }
)

// 手动删除监听器
unsubscribe()
七、pinia-plugin-persist持久化储存配置

1.使用持久化存储插件

import { createPinia } from "pinia";
import piniaPersist from "pinia-plugin-persist";

const pinia = createPinia();
pinia.use(piniaPersist); //使用持久化插件

export default pinia;

2.持久化存储配置,defineStore时增加persist配置

import {defineStore} from "pinia";

const demoStore = defineStore('demoStore', {
    state: () => ({
        userId: '213213',
        userName: '张三'
    }),
    persist: {//pinia持久化配置,默认sessionStorage
        enabled: true
    }
});


export default demoStore

3.持久化储存配置项

  • enabled:是否启用持久化村村
  • strategies:配置策略
    4.配置策略之自定义储存,自定义储存key,并且使用localStorage储存
import {defineStore} from "pinia";

const demoStore = defineStore('demoStore', {
    state: () => ({
        userId: '213213',
        userName: '张三'
    }),
    actions: {//actions是store的方法methods
        updateState(info) {
            this.$state = {
                ...this.$state,
                ...info
            }
        }
    },
    persist: {//pinia持久化配置,默认sessionStorage
        enabled: true,
        strategies: [{
            key:'demo',
            storage: localStorage
        }]
    }
});


export default demoStore

5.配置策略之不同的状态使用不同的储存方式,如下代码:userId使用sessionStorage,userName使用localStorage

import {defineStore} from "pinia";

const demoStore = defineStore('demoStore', {
    state: () => ({
        userId: '213213',
        userName: '张三'
    }),
    actions: {//actions是store的方法methods
        updateState(info) {
            this.$state = {
                ...this.$state,
                ...info
            }
        }
    },
    persist: {//pinia持久化配置,默认sessionStorage
        enabled: true,
        strategies: [{
            storage: sessionStorage,
            paths: ['userId']
        }, {
            storage: localStorage,
            paths: ['userName']
        }]
    }
});


export default demoStore

6.配置策略之定制存储

import Cookies from 'js-cookie'

const cookiesStorage = {
  setItem (key, state) {
    return Cookies.set('accessToken', state.accessToken, { expires: 3 })
  },
  getItem (key) {
    return JSON.stringify({
      accessToken: Cookies.getJSON('accessToken'),
    })
  },
}

export const useUserStore = defineStore('storeUser', {
  state () {
    return {
      firstName: 'S',
      lastName: 'L',
      accessToken: 'xxxxxxxxxxxxx',
    }
  },
  persist: {
    enabled: true,
    strategies: [
      {
        storage: cookiesStorage,
        paths: ['accessToken']
      },
    ],
  },
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2326166.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣HOT100之矩阵:48. 旋转图像

这道题本来想用剥洋葱的办法的&#xff0c;一直写不对&#xff0c;放弃了。。。直接去看题解&#xff0c;用剥洋葱其实也可以做&#xff0c;就是要从外层处理到内层&#xff0c;每一个边界上的元素为matrix[0].size() - 1个&#xff0c;这样一来&#xff0c;四条边界上的元素个…

uniapp微信小程序获取用户手机号uniCloud云开发版

开发微信小程序&#xff0c;很多时候需要获取用户的手机号&#xff0c;这样方便平台更好的为用户服务&#xff0c;但是微信小程序不允许开发者直接获取用户的手机号&#xff0c;需要用户手动授权才能获取手机号&#xff0c;且需要配合后端进行解密才能获得完整的手机号&#xf…

31天Python入门——第18天:面向对象三大特性·封装继承多态

你好&#xff0c;我是安然无虞。 文章目录 面向对象三大特性1. 封装2. 继承3. 多态4. 抽象基类5. 补充练习 面向对象三大特性 面向对象编程&#xff08;Object-Oriented Programming, 简称OOP&#xff09;有三大特性, 分别是封装、继承和多态.这些特性是面向对象编程的基础, …

第十六届蓝桥杯模拟二(串口通信)

由硬件框图可以知道我们要配置LED 和按键 一.LED 先配置LED的八个引脚为GPIO_OutPut,锁存器PD2也是,然后都设置为起始高电平,生成代码时还要去解决引脚冲突问题 二.按键 按键配置,由原理图按键所对引脚要GPIO_Input 生成代码,在文件夹中添加code文件夹,code中添加fun.…

UE5学习笔记 FPS游戏制作32 主菜单,暂停游戏,显示鼠标指针

文章目录 一主菜单搭建UI显示主菜单时&#xff0c;暂停游戏&#xff0c;显示鼠标绑定按钮 二 打开主菜单 一主菜单 搭建UI 添加一个MainUi的控件 添加一个返回游戏的按钮和一个退出游戏的按钮 修改一下样式&#xff0c;放中间 显示主菜单时&#xff0c;暂停游戏&#xff0…

LLM - 开源强化学习框架 OpenR1 的环境配置与训练参数 教程

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/146838740 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 OpenR1 是一个开源的强化学习框架,复现 DeepSeek-R1 的训练流程,为研…

蓝桥杯备赛之枚举

用循环等方式依次去枚举所有的数字组合&#xff0c;一一验证是否符合题目的要求 题目链接 0好数 - 蓝桥云课 题目解析 好数的概念: 数的奇数位位奇数,偶数位为偶数,就是一个好数 求输入n里面有多少个好数 题目原理 1> 遍历每个数 2> 每次遍历判断是不是好数 把这…

C++编程语言:抽象机制:一个矩阵的设计(Bjarne Stroustrup)

第29章 一个矩阵的设计(A Matrix Design) 目录 29.1 引言 29.1.1 基本的 Matrix 用法 29.1.2 Matrix 的要求 29.2 一个 Matrix 模板 29.2.1 构造和赋值(Construction and Assignment) 29.2.2 下标和分片(Subscripting and Slicing) 29.3 Matrix算术运算(Matrix…

MSYS2学习笔记

前言 本文内容是MSys2 Documentation的学习笔记可以使用MSYS2编译QGis 学习笔记 什么是MSYS2&#xff1f; MSYS2&#xff08;Minimal System 2&#xff09;是一个为Windows平台打造的软件开发环境和包管理系统&#xff0c;它结合了Cygwin的POSIX兼容层、Arch Linux的pacman…

合规+增效 正也科技携智能营销产品出席中睿论坛

正也科技作为医药数字化领域的标杆企业&#xff0c;受邀参展第二届中睿医健产业企业家年会暨第十三届中睿医药新春论坛&#xff0c;本次论坛以“合力启新程”为主题&#xff0c;吸引了800多位医药健康企业的董事长、总经理参与&#xff0c;并通过主论坛、分论坛、路演等形式探讨…

计算机网络 TCP/IP参考模型

目录 TCP IP模型预览 OSI和TCP的相同点 OSI和TCP的不同点 层参考模型 层参考模型的数据封装与解封装 TCP IP模型预览 OSI和TCP的相同点 OSI和TCP的不同点 层参考模型 层参考模型的数据封装与解封装

JSON的基础知识

文章目录 前言json协议的基本格式json 数组类型 的语法规则json协议报文的实例json常见的一些格式错误在gd32中使用cjson库小结 前言 json协议在互联网应用&#xff0c;物联网应用中都会用到。所谓工欲善其事必先利其器&#xff0c;我们需要学习了解json协议的具体格式&#xf…

区间预测 | MATLAB实现QRBiGRU门控循环单元分位数回归时间序列区间预测

区间预测 | MATLAB实现QRBiGRU门控循环单元分位数回归时间序列区间预测 目录 区间预测 | MATLAB实现QRBiGRU门控循环单元分位数回归时间序列区间预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 区间预测 | MATLAB实现QRBiGRU门控循环单元分位数回归时间序列区…

11 配置Hadoop集群-免密登录

第一课时 一、复习导入 前面的课程中我们在虚拟机上安装并测试使用了hadoop的示例程序wordcount&#xff0c;并且在准备好了集群的同步工具&#xff0c;那接下来&#xff0c;我们就可去配置hadoop集群了。 二、授新 &#xff08;一&#xff09;认识ssh命令 SSH&#xff08;Secu…

13 配置Hadoop集群-测试使用

第一课时 一、导入 前面的课程我们搭建了hadoop集群&#xff0c;并成功启动了它&#xff0c;接下来我们看看如何去使用集群。 测试的内容包括&#xff1a;1.上传文件&#xff0c;2.下载文件&#xff0c;3.运行程序 二、授新 &#xff08;一&#xff09;上传小文件 上传文件的时…

简单ELK框架搭建

简介 ELK 框架是一套开源的日志管理和分析工具&#xff0c;由 Elasticsearch、Logstash 和 Kibana 三个主要组件组成&#xff0c;现在新增了Filebeat组件&#xff0c;可以更高效的收集数据。 Elasticsearch&#xff1a;是一个分布式、高可扩展的开源搜索引擎&#xff0c;能快速…

Vue2和Vue3响应式的基本实现

目录 简介Vue2 响应式Vue2 响应式的局限性 Vue3 响应式Vue3 响应式的优点 Vue2 和 Vue3 响应式对比 简介 在 Vue 框架中&#xff0c;数据的响应式是其核心特性之一。当页面数据发生变化时&#xff0c;我们希望界面能自动更新&#xff0c;而不是手动操作 DOM。这就需要对数据进…

RCE(自增、取反、异或)

自增: 也就是说&#xff0c;a > b&#xff0c;b > c... 所以&#xff0c;我们只要能拿到一个变量&#xff0c;其值为a&#xff0c;通过自增操作即可获得a-z中所有字符。 无字母数字构造&#xff1a; 所有敏感字符串&#xff08;ASSERT、_POST&#xff09;通过自增动态生…

【深度学习新浪潮】图像修复(Image Inpainting)技术综述:定义、进展与应用展望

本文为精简版,完整技术细节与参考文献可与作者讨论。 1. 图像修复的定义与核心目标 图像修复(Image Inpainting)是一种通过算法手段填补图像中缺失区域或移除不需要对象的技术,其核心目标是利用图像上下文信息生成与周围像素一致且视觉自然的内容。该技术通过计算机视觉和…

计算机视觉——传统数字图像处理中图像去噪原理与代码实现细节

1. 概述 在现实世界中捕获的图像常常受到噪声的影响&#xff0c;这些噪声可能来源于环境因素、信号不稳定、相机传感器问题、照明条件差、电损失等多种因素。为了进一步处理这些图像并对结果进行准确解释&#xff0c;拥有尽可能低噪声的图像至关重要。图像去噪是数字图像处理中…