从零开始Vue3+Element Plus后台管理系统(六)——状态管理Pinia和持久化

news/2024/10/28 18:32:16/

Pinia

官网:https://pinia.vuejs.org/zh/

Pinia 是 Vue 的专属状态管理库,相比Vuex更好用,优点不多了说官网有,用起来最重要!

在应用的根部注入创建的 pinia

// main.ts
import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'const pinia = createPinia()
const app = createApp(App)app.use(pinia)
app.mount('#app')

定义store,拿用户登录举个简单例子

在src目录新建文件夹store,然后新建文件user.ts

import { defineStore } from 'pinia'
import { ref } from 'vue'
import { login } from '~/api/user'  
import { UserInfo } from '~/types/index' // 此处采用组合式API写法
// Pinia 同样支持选项式API写法
export const useUserStore = defineStore('user',() => {let username = ref('')async function userLogin(param: UserInfo) {const result = await login({ username: param.username, password: param.password })if (result) {username.value = param.username}return result}return { username, userLogin }}
)

在Vue页面中使用Pinia

import { useUserStore } from '~/store/user'
...const userStore = useUserStore()const submitForm = (formEl: FormInstance | undefined) => {if (!formEl) returnformEl.validate(async (valid: boolean) => {if (valid) {const result = await userStore.userLogin(param)if (result) {router.push('/')}}})
}
...

持久化插件pinia-plugin-persistedstate

如果我们把登录用户的信息放在Pinia中,那肯定需要做持久化,要不页面一刷新,用户信息就没有了。

比较粗暴的做法就是直接使用localStorage/sessionStorage来保存用户信息(连Pinia都不用),进阶做法是当Pinia保存后再给localStorage保存一份,退出登录时同时清理这两处的数据。

更加优雅的做法应该是使用轮子,让代码更干净可配置,来试试持久化插件吧,大家比较推荐的是pinia-plugin-persistedstate,更稳定更少bug。

安装 pinia-plugin-persistedstate

npm i pinia-plugin-persistedstate

修改配置

//main.tsimport { createApp } from 'vue'
import { createPinia } from 'pinia'
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate' // 新增
import App from './App.vue'const pinia = createPinia()
pinia.use(piniaPluginPersistedstate)  // 新增
const app = createApp(App)app.use(pinia)
app.mount('#app')
// store/user.ts
export const useUserStore = defineStore('user',() => {let username = ref('')...return { username, userLogin }},// 新增{persist: true}
)

这时再点击登录,localstorage就会新增user了 👍

image.png

如果想给key值改名

persist: { key: 'my-custom-key', },

如果你想把数据保存在sessioinStorage中,可以配置persist

persist: { storage: sessionStorage, },

给Tags页签组件增加持久化

本项目的页签组件Tags本来也没有做持久化,刷新页面时tag会丢失其他已打开的页面,引入pinia-plugin-persistedstate 之后,只用在store/tags.ts 加入persist配置就好了。

 persist: {storage: sessionStorage},

更多的配置请参考官方文档:https://prazdevs.github.io/pinia-plugin-persistedstate/zh/guide/config.html

踩坑

按照官方文档配完应该就可以按F12在localStorage中看到我刚才写的user,然而又掉坑了,坑虽不大,记录下也是应该的。

因为疏于使用pinia,所以在写store/user.ts的时候,直接照着官网文档又来了一遍createPinia,然后把persistedstate插件挂在它身上,结果localStorage怎么也不出来。

🌹 正确的做法是在main.ts挂载pinia的时候,把persistedstate插件挂上去,别的store文件就不要再createPinia了,一切OK!

小tips

还有一点需要注意,在使用组合式API写法时,state定义需要使用ref,否则也会拿不到数据,所以千万别写成:

    let username = ref('')  // 正确let username = ''  // 错误

Setup Store 中:

  • ref() 就是 state 属性
  • computed() 就是 getters
  • function() 就是 actions

如果使用选项式API,就不用操心这个。养成习惯就好哈~

本项目GIT地址:github.com/lucidity99/…


http://www.ppmy.cn/news/68874.html

相关文章

代码量原地缩减50%,这个Java工具类库太香了

Guava是google公司开发的一款Java类库扩展工具包,内含了丰富的API,涵盖了集合、缓存、并发、I/O等多个方面。使用这些API一方面可以简化我们代码,使代码更为优雅,另一方面它补充了很多jdk中没有的功能,能让我们开发中更…

构造函数(包括默认构造函数) ,析构函数的使用与特性

文章目录 一、构造函数二、默认构造函数(也是构造函数)默认构造函数的种类:1.无参类型2.全缺省类型3.编译器自动生成的4.汇总 三、析构函数 一、构造函数 构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自…

汇编五、伪指令与汇编程序结构

1、伪指令 1.1、概念 (1)伪指令是用于对汇编过程进行控制的指令,该类指令并不是可执行指令,没有对应机器码,只用于汇编过程中为汇编程序提供汇编信息,帮助编译器编译。 1.2、ASM51提供的伪指令 伪指令分为如下几类。 1.2.1、…

SpringSecurity 一文彻底掌握

文章目录 前言一、SpringSecurity Web方案🍓Test Controller 测试请求控制器🤣SpringSecurity 基本原理🌍代码底层流程:重点看三个过滤器FilterSecurityInterceptor 方法级的权限过滤器ExceptionTranslationFilter 异常过滤器User…

golang web学习随便记6-模板引擎

以下代码是几乎最简单的一个模板&#xff0c;{{ . }} 表示执行模板时将嵌入的数据 <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8"><title>Go Web 编程</title> <…

C语言200行代码实现简易三子棋

前言 三子棋应该是是我们最早接触到的棋类游戏&#xff0c;用C语言实现三子棋对初学者来说是一种不错的锻炼 编写三子棋只需要用到数组、函数和生成随机数的知识&#xff0c;所以比较适合成为编程学习者编写的第一个小游戏。 一.代码实现 第一部分是源码复制就可以使用&…

C++基础篇:05 静态成员与单例模式

1 静态成员 1.1 什么是静态成员 被static修饰的成员变量、成员函数都称为静态成员 1.2 普通成员的特点 普通成员变量&#xff1a;每个类对象中都独有一份成员变量&#xff0c;相互之间没有任何关联 普通成员函数&#xff1a;都隐藏着一个this指针 1.3 静态成员的特点 静态成…

深入探究C++中的仿函数和迭代器——提升你的STL技能

&#x1f4d6;作者介绍&#xff1a;22级树莓人&#xff08;计算机专业&#xff09;&#xff0c;热爱编程&#xff1c;目前在c&#xff0b;&#xff0b;阶段>——目标Windows&#xff0c;MySQL&#xff0c;Qt&#xff0c;数据结构与算法&#xff0c;Linux&#xff0c;多线程&…