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

news2024/11/30 6:41:29

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) return
  formEl.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.ts

import { 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.coloradmin.cn/o/527925.html

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

相关文章

CLMP证书:让你在职场中脱颖而出的秘密武器!

CLMP证书是一种精益管理专业证书,是针对精益管理领域的专业人士和学生的培训项目,旨在提高他们在精益管理方面的技能和知识。那么,CLMP证书的含金量高吗?接下来我们来探讨一下。 CLMP证书的优势体现 首先,CLMP证书的…

Android Jetpack Compose之使用脚手架快速搭建APP布局结构

概述 现在市场上大多数的手机APP的通用布局结构都是顶部有个顶部导航栏,底部有个底部导航栏,例如抖音的布局结构: 点击导航栏里面的各个项又可以跳转到相应的页面,现在这种结构特别流行,如果我们使用传统的View来实现…

Web自动化测试-如何进行Selenium页面数据及元素交互?教你一步不漏。

目录 前言: 一、Selenium简介 二、安装Selenium 1.Windows用户安装Selenium 2.安装Chrome浏览器驱动 三、使用Selenium进行页面数据及元素交互 1.启动浏览器 2.访问网页 3.查找元素 4.输入文本 5.点击按钮 6.提交表单 四、完整代码示例 五、总结 Web自…

(MIT6.045)自动机、可计算性和复杂性-DFA和NFA

毕业论文写完了。找点事干干。 佛系更新。 这是一门讲述 什么是计算?什么能被计算?怎么高效计算? 的哲学、数学和工程问题的课程。 主要包括: 有限状态机(Finite Avtomata):简单的模型。 可…

【OpenCV-Python】——机器学习kNN算法SVM算法k均值聚类算法深度学习图像识别对象检测

目录 前言: 1、机器学习 1.1 kNN算法 1.2 SVM算法(支持向量机) 1.3 k均值聚类算法 2、深度学习 2.1 基于深度学习的图像识别 2.2 基于深度学习的对象检测 总结: 前言: 机器学习(ML)是人…

Linux-权限

1. 认识Linux下用户的分类 root普通用户1.1用户切换 普通用户 转 root su //当前路径切换rootsu - //重新登陆到/root退出 crtl d / exit root 转 普通用户 不需要输入密码 su 用户名退出 ctrl d 1. 2 指令暂时提权 sudo command目前我们用adduser新建的用户&#xff0…

100个软件开发领域必须掌握的关键词,掌握一个都难啊

需要完整xmind文件,私信获取 100个软件开发领域必须掌握的关键词 基础编程语言 JavaPythonC#JavaScriptPHPRubyCObjective-CSwiftKotlin Web 开发 HTMLCSSJavaScriptReactAngularVue.jsjQueryBootstrapNode.jsExpress.js 移动应用开发 AndroidiOSFlutterRea…

100万数据,如何快速的导入数据库?

数据导出、导入是非常常见的开发操作,但在这个过程中,很多开发者都会遇到诸如数据乱码、数据格式不支持、数据量太大等问题。NineData 最新发布的数据导入功能,帮助用户在保障数据完整和准确的同时,轻松地将大量的数据从文件中导入…

利用项目管理工具实现项目日程安排:技巧与步骤详解

到 2022 年,我们可能会发现自己在思考过去的生活,以及我们的工作常规是否会回到原来的样子。我们中的一些人觉得我们过去常常完成更多的工作,而且我们中的许多人都在努力保持精神健康,同时保持工作效率。平衡我们的工作生活和个人…

深兰科技|功能迭代!metamind APP发布v1.2版本

以目前AI的技术水平,只要样本足够多,模仿一个人的面容、声音、语气,可以达到相似度90%以上。假设未来科技足够发达,能够通过记录一个人一生的数据来“复活”他,你会怎么选择?而如果你没有足够多的属于自己的…

如何利用python调用API接口获取数据进行测试

一、Python 可以使用 requests 库来调用 API 接口获取数据。以下是基本的步骤: 1.安装 requests 库 pip install requests 2.导入 requests 库 import requests 3.构建 API 请求的 URL 根据 API 文档,构建请求的URL。 例如, https://a…

C++——STL之空间配置器

文章目录 1. 什么是空间配置器2. 为什么需要空间配置器3. SGI-STL空间配置器实现原理3.1 一级空间配置器3.2 二级空间配置器3.2.1 内存池 3.3 空间配置器的再次封装3.4 对象的构造与释放 4. 与容器结合 1. 什么是空间配置器 空间配置器,顾名思义就是为各个容器高效…

深入了解Kotlin密封接口的强大功能

深入了解Kotlin密封接口的强大功能 当 Kotlin 首次引入时,开发者迅速爱上了它的强大语言特性,其中包括密封类。然而,有一件事似乎还缺失了:密封接口。当时,Kotlin 编译器无法保证在 Java 代码中无法实现接口&#xff0…

Dart 3.0 语法新特性 | Records 记录类型 (元组)

theme: cyanosis 终于,终于,终于, Dart 支持元组了! 官方称之为 Records 特性,所以入乡随俗,以后中文称之为 记录类型 。官方 对它的介绍 是: Records are an anonymous, immutable, aggregate type. 记录…

I3C仿真:PGY I3C-EX-PD使用

简述 本文所使用的I3C仿真软件是由Prodigy Technovations Pvt. Ltd公司所研发的MIPI PGY-I3C-EX-PD I3C仿真设备,这款设备搭载了配套软件,专门用于模拟I3C设备,它可以实现模拟Master、SLAVE,同时也支持模拟I2C Slave&#xff0c…

sklearn中的特征工程(过滤法、嵌入法和包装法)

目录 ​编辑特征工程的第一步:理解业务 Filter过滤法 ​编辑方差过滤 ​编辑- 相关性过滤 - 卡方过滤 - F检验 - 互信息法 ​编辑嵌入法(Embedded) 包装法(Wrapper) 特征工程的第一步:理解业务 如…

公司大数据CDH技术选型升级为EMR集群的技术调研

大数据技术栈现状 大数据技术整体设计图 当前大数据各组件版本 ZooKeeper 3.4.5 Spark 2.4.0 Hue 4.3.0 Hive 2.1.1 Hbase 2.1.4 Hadoop 3.0.0 Kafka 2.2.1 Phoenix 5.0.0-cdh6.2.0 Dolphinscheduler 3.0.0 Yarn 3.0.0-cdh6.3.2 Logstash 7.7.0 Kibana 7.7.0 Elasticsearch 7…

反涉网犯罪研究 | 电商平台自动收货代码审计

0x00 免责声明 本文仅限于学习讨论与反诈知识的分享,不得违反当地国家的法律法规。对于传播、利用文章中提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,本文作者不为此承担任何责任,一旦造成后果请自行承担…

信息发布系统在医院体检中心的运用

随着生活水平条件的提高,大家的健康意识更加强,重视体检的人数也越来越多,因此体检中心,医院体检门诊中心人流量都很大,健康市场空间前景大,各种医疗健康机构快速发展,市场竞争激烈,…

Linux——互斥和同步(二)

目录 信号量 读写信号量 互斥量 RCU机制 虚拟串口驱动加入互斥 完成量 习题 信号量 前面所讨论的锁机制都有一个限制,那就是在锁获得期间不能调用调度器,即不能引起进程切换。但是内核中有很多函数都可能会触发对调度器的调用(在中断的…