Vue3 Vite3 状态管理 pinia 基本使用、持久化、在路由守卫中的使用

参考https://juejin.cn/post/7152774411571953677,自己简洁化了一部分

1.安装pinia依赖

yarn add pinia

创建pini实例

根目录创建store文件夹,然后创建index.js

import { createPinia } from 'pinia'const pinia = createPinia()export default pinia

main.js中使用


import pinia from '@/store'app.use(pinia)

在 store/ 目录下创建 modules 目录,存储每个模块的状态,现在新建一个demo.js

counter就是变量,incremen就是操作变量的函数

import { defineStore } from 'pinia'
import { ref } from 'vue'const useDemoStore = defineStore('demo', () => {const counter = ref(0)const increment = () => {counter.value++}return {counter,increment}
})export default useDemoStore


页面中使用,

在组件 xxx.vue 中使用 demo 中的状态 counter 和改变状态的函数 increment

先引入 demo.ts 中定义的 useDemoStore 函数,通过该函数创建 demoStore 实例。然后就可以调用 demoStore 的状态 counterincrement 函数了。这里需要注意,无论是 pinia 还是 vuex,通过解构的方式获取状态,会导致状态失去响应性。如:const { counter } = demoStore 需要使用storeToRefs函数

<script lang="ts" setup>
import useDemoStore from '@/store/modules/demo'
import { storeToRefs } from 'pinia'const demoStore = useDemoStore()
const { counter } = storeToRefs(demoStore)const add = () => {demoStore.increment()
}</script>

 2 持久化 pinia 状态

为什么要持久化,比如说我们使用pinia存储了用户信息,然后用户刷新了页面,或者关闭了浏览器,下次再打开,那么用户信息就会丢失,所以我们需要持久化处理,也就是让数据像缓存一样一直存在

安装插件pinia-plugin-persistedstate

yarn add pinia-plugin-persistedstate

store/index.js中引入该插件,在创建 pinia 实例时传入该插件

import { createPinia } from 'pinia'
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'const pinia = createPinia()
pinia.use(piniaPluginPersistedstate)export default pinia

在需要持久化状态的模块中设置 persist

依旧用上面的demo.js做例子,区别在于defineStore函数多传了第三个函数{ persist: true }。此时浏览器刷新或者关闭浏览器再次打开,数据都会一直存在

import { defineStore } from 'pinia'
import { ref } from 'vue'const useDemoStore = defineStore('demo', () => {const counter = ref(0)const increment = () => {counter.value++}return {counter,increment}
}, {persist: true
})export default useDemoStore

persist 支持多种类型的值,最简单的就是传递 true,此时会将状态缓存在 localStorage 中,该 localStorage 的 key 为模块名(defineStore 的第一个参数),value 为该模块的状态对象,由于该模块只有一个状态 counter,故value为 {"counter":8}。如下图:

image-20221009151822704

如果需要将其存储在 sessionStorage 中,就需要设置 persist 的值为一个对象:

...
const useDemoStore = defineStore('demo', () => {...
}, {persist: {key: 'aaa',storage: sessionStorage}
})

此时状态就会同步缓存到 sessionStorage 中,并且key 为咱们指定的 key

image-20221009152105536

persist 对象类型为 PersistedStateOptions,上面演示了 keystorage 属性,该对象的其他属性如下:

}
interface PersistedStateOptions {/*** Storage key to use.* @default $store.id*/key?: string;/*** Where to store persisted state.* @default localStorage*/storage?: StorageLike;/*** Dot-notation paths to partially save state. Saves everything if undefined.* @default undefined*/paths?: Array<string>;/*** Customer serializer to serialize/deserialize state.*/serializer?: Serializer;/*** Hook called before state is hydrated from storage.* @default null*/beforeRestore?: (context: PiniaPluginContext) => void;/*** Hook called after state is hydrated from storage.* @default undefined*/afterRestore?: (context: PiniaPluginContext) => void;
}

3 在路由守卫中使用状态

前面演示了在组件中使用 pinia,在组件外如何使用呢?这里演示在全局路由守卫中获取状态值。咱们创建一个路由守卫,在路由守卫中使用 nprogress 显示页面加载进度条。

安装nprogress

nprogress是一个页面加载中的进度条插件

yarn add nprogress

router/index.js配置

import router from '@/router'
import nProgress from 'nprogress'
import 'nprogress/nprogress.css'
import useDemoStore from '@/store/modules/demo'
import { storeToRefs } from 'pinia'nProgress.configure({showSpinner: false
})// 全局前置守卫
router.beforeEach((to, from) => {nProgress.start()const demoStore = useDemoStore()const { counter } = storeToRefs(demoStore)// 从 store 中获取其他值,再决定返回值// 这里演示获取 store 中 counter 的值console.log(`counter:${counter.value}`)return true
})// 全局后置钩子
router.afterEach(() => {nProgress.done(true)
})

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

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

相关文章

如何使用人工智能和ChatGPT来优化营销转化率

人工智能 &#xff08;AI&#xff09; 和营销的交集正在彻底改变企业与客户互动的方式&#xff0c;最终改变营销转化率。人工智能能够分析大量数据、理解模式和自动执行任务&#xff0c;它不仅是一项创新技术&#xff0c;而且是营销领域的根本性转变。这种转变允许更加个性化、…

【计算机毕业设计】ssm073基于Word自动出题系统

基于Word自动出题系统 操作系统: Windows XP或Windows 7 开发工具: myeclipse 数据库: MySQL 系统研究目的及意义&#xff1a; 本课题研究通过信息化的手段进行对试题的出题工作&#xff0c;实现更加有效便捷的试题的编写和试卷的生成。这样不仅可以最大程度上较少学校教研工作…

NacosException: http error, code=403、NacosimeException——报错解决方法【Nacos2.x】

1、NacosException报错内容为&#xff1a; NacosException: http error, code403,msguser not found!,dataIdapplication-dev.yml,groupDEFAULT_GROUP,tenant连不上是因为成功开启鉴权后&#xff0c;所使用的Spring Cloud服务被拦截&#xff0c;需要在配置中添加Nacos用户名和…

年龄危机的七个来源

1&#xff09;后生可畏 我们70后是相对幸运的&#xff0c;50后、60后知识结构往往会有欠缺&#xff0c;比如没上过大学&#xff0c;没留过洋&#xff0c;英文不好&#xff0c;或者数学有明显缺陷&#xff0c;但是80后、90后的知识结构和经历结构会比70后更好。 那麻烦来了&…

Harbor高可用(nginx和keepalived)

Harbor高可用&#xff08;nginx和keepalived&#xff09; 文章目录 Harbor高可用&#xff08;nginx和keepalived&#xff09;1.Harbor高可用集群部署架构1.1 主机初始化1.1.1 设置网卡名和ip地址1.1.2 设置主机名1.1.3 配置镜像源1.1.4 关闭防火墙1.1.5 禁用SELinux1.1.6 设置时…

【mybatis】TypeAliasRegistry解读

引言 在现代软件开发中&#xff0c;对象关系映射&#xff08;ORM&#xff09;框架已成为连接应用程序和数据库的桥梁&#xff0c;而MyBatis以其灵活性和简洁性&#xff0c;在众多Java ORM框架中脱颖而出。它不仅提供了丰富的映射功能&#xff0c;还允许开发者以接近SQL的方式进…

基于OpenCV的图像处理案例之图像矫正(Python)

Index 目录索引 写在前面解决思路参考 写在前面 本文通过一个案例介绍如何使用OpenCV将倾斜的扫描文档图像进行水平矫正。 解决思路 因为扫描图像中的大部分文字倾斜后&#xff0c;同一行文字也在同一条直线&#xff0c;所以可以通过拟合直线来计算文本倾斜角度&#xff0c;…

C++初阶:2_类与对象(中)

类与对象(中) 一.类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 默认成员函数&#xff1a;用户没有显式实现&am…

C语言自定义类型结构体

variable adj.易变的&#xff0c;多变的&#xff1b;时好时坏的&#xff1b;可变的&#xff0c;可调节的&#xff1b; &#xff08;数&#xff09;&#xff08;数字&#xff09;变量的&#xff1b;&#xff08;植&#xff0c;动&#xff09;变异的&#xff0c;变型的&#xff1…

【保姆级教程】YOLOv8_Track多目标跟踪,快速运行

一、YOLOV8环境准备 1.1 下载安装最新的YOLOv8代码 仓库地址&#xff1a; https://github.com/ultralytics/ultralytics1.2 配置环境 pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple二、下载测试视频&#xff0c;预训练权重 测试视频 链接&am…

Qt pro项目文件属性

一.Qt pro项目文件属性介绍 Qt项目的.pro文件是项目管理文件&#xff0c;用于记录项目设置和组织管理项目包含的文件。以下是一些主要属性及其介绍&#xff1a; QT: 指定项目使用的Qt模块。例如&#xff0c;QT core gui表示项目中加入core和gui模块。如果使用到数据库操作&…

腾讯云COS - 前端上传文件到 COS 跨域问题

问题描述 原因分析 因为我本地的地址是&#xff1a;http://localhost:9528 而发送请求时的地址是&#xff1a;http://132-1307119153.cos.ap-beijing.myqcloud.com/tu.jpg 域名不同&#xff0c;自然而然就出现了跨域的问题&#xff01; 解决方案 先点击对象存储 - 安全设置…

C#如何从上次窗体关闭的位置打开窗体

目录 1.操作方法 &#xff08;1&#xff09;Location属性 &#xff08;2&#xff09;读写注册表 &#xff08;3&#xff09;SetValue方法 &#xff08;4&#xff09;命名空间 2.示例 实际开发中&#xff0c;有很多软件都有一个通用的功能&#xff0c;即从上次关闭位置启动…

mysql 事务基本介绍

目录 命令小结 一 MySQL事务的概念 &#xff08;一&#xff09;事务介绍 &#xff08;二&#xff09;事务特点 &#xff08;三&#xff09;事务的ACID特点 1&#xff0c;原子性 1.1 原子性具体形容 1.2 原子性案例 2 &#xff0c;一致性 2.1一致性具体介绍 2.2…

《数字集成电路物理设计》学习笔记(持续更新中)

参考书籍&#xff1a; 《数字集成电路物理设计》pdf下载百度云链接&#xff1a; 链接: https://pan.baidu.com/s/1jOD54q_f9KLhfX6InabTRA?pwd8888 提取码: 8888 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 --来自百度网盘超级会员v8的分享 目录 第1章 集…

C++ set 、unordered_set 删除

erase() 语法格式 set_name.erase(element);//删除 set 容器中值为 val 的元素name.erase(iterator position);//删除 position 迭代器指向的元素name.erase(iterator start, iterator end);//删除 [start,end) 区间内的所有元素示例 set<int> myset{1,2,3,4,5}; myse…

Vue 常见面试题(一)

目录 1、Vue 的最大的优势是什么&#xff1f;&#xff08;必会&#xff09; 2、Vue 和 jQuery 两者之间的区别是什么&#xff1f;&#xff08;必会&#xff09; 3、MVVM 和 MVC 区别是什么&#xff1f;哪些场景适合&#xff1f;&#xff08;必会&#xff09; 1、基本定义 2…

索尼下一代游戏主机PS5将于11月20日发售

索尼下一代游戏机PS5将于2020年11月20日发布。据悉&#xff0c;这款游戏机的售价可能会达到499美元&#xff08;约合人民币3500元&#xff09;。 我们知道游戏主机的价格低于游戏PC的价格。 既然PS5的主要硬件配置已经公开&#xff0c;那么现在配置一台同样配置的游戏PC需要多少…

WSL2的安装步骤

WSL2&#xff08;Windows Subsystem for Linux 2&#xff09;是微软公司开发的一项创新性技术&#xff0c;它在Windows操作系统上提供了一个完整的Linux内核&#xff0c;并允许用户在Windows环境中运行Linux发行版。之前想在Windows上使用Linux系统必须先安装VirtualBox或VMWar…

实战whisper语音识别第一天,部署服务器,可远程访问,实时语音转文字(全部代码和详细部署步骤)

Whisper是OpenAI于2022年发布的一个开源深度学习模型&#xff0c;专门用于语音识别任务。它能够将音频转换成文字&#xff0c;支持多种语言的识别&#xff0c;包括但不限于英语、中文、西班牙语等。Whisper模型的特点是它在多种不同的音频条件下&#xff08;如不同的背景噪声水…