解决Vue中仓库持久化的问题,不借助插件用原生JS实现仓库持久化。了解仓库的插件机制、监听的时机

1、演示

前言:目前Vue有两种仓库,一种是Vuex,一种是Pinia,懂得都懂,这里就不详细介绍这两者的区别了

2、什么是持久化

仓库里面的数据是需要跨越页面周期的,当页面刷新之后数据还在,在默认情况下肯定是不行的,因为仓库里面的数据实际上是存在内存里面的,本质上就是一个对象,对象就在内存里面

如果说需要跨越页面周期的话,就需要把仓库的数据持久化的保存起来,具体的保存位置可以是localStorage、webStorage、sessionStorage、indexD等等,也可以是别的。具体保存在哪里无所谓,反正要保存起来。

3、Vuex的做法

import { createStore } from 'vuex'
import counter from './counter'
import text from './text'
const store = createStore({modules: {counter,text,},plugins: [???],
})

在建立仓库的时候实际上是可以配置插件的,因此可以配置 plugins 属性,让它支持一些插件。插件的本质其实就是一个函数,因此可以在插件中放入一个自己写的函数

这个函数的运行时间在仓库创建之后,并且可以把整个仓库对象(store)传出去

plugin: [persisPlugin]

定义这个函数并接收仓库对象

function persisPlugin(store) {}

存储数据

存储数据一般有两种做法:

1、只要仓库的数据一变,马上就存一次 优点就是实时性会非常高 但是会影响一些效率因为存数据还是比较耗时的

2、在关闭页面或者是刷新页面的时候 之前的页面会被卸载,在页面卸载的时候把数据存起来

  window.addEventListener('beforeunload', () => {localStorage.setItem('VUEX_DATA', JSON.stringify(store.state))})

取出数据

取出数据的方法:

1、在最开始的时候就把它取出来

  try {const state = JSON.parse(localStorage.getItem('VUEX_DATA'))if (state) {// 解析出来了之后就替换掉原来仓库的数据store.replaceState(state)}} catch (error) {console.log('存储的数据有误')}

注意:用 try catch 的原因就是有可能会报错,比如果之前没有存 或者存储的格式被篡改了

完整代码

import { createStore } from 'vuex'
import x1 from './x1'
import x2 from './x2'
const store = createStore({modules: {x1,x2,},plugin: [persisPlugin],
})function persisPlugin(store) {window.addEventListener('beforeunload', () => {localStorage.setItem('VUEX_DATA', JSON.stringify(store.state))})try {const state = JSON.parse(localStorage.getItem('VUEX_DATA'))if (state) {// 解析出来了之后就替换掉原来仓库的数据store.replaceState(state)}} catch (error) {console.log('存储的数据有误')}
}
export default store

4、Pinia的做法 

Pinia也是支持插件的,但是在Vue3中,插件的使用需要同过use方法

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

Pinia里面的插件也是一个函数 因此我们定义函数并且使用

function piniaPlugin(context) {}
pinia.use(piniaPlugin)

跟Vuex的区别

1、Pinia接收的不是整个仓库,而是一个context

2、Pinia里面的仓库是分开存储的

3、替换值的时候Vuex用replaceState,Pinia用$pacth

第2点分开存储意思解析

比如这是A仓库

import { defineStore } from 'pinia'
const useStore = defineStore('A',()=>{})

 这是B仓库

import { defineStore } from 'pinia'
const useStore = defineStore('B',()=>{})

3、因此Pinia里面会有多条存储记录

存储数据

Pinia跟Vuex的存储时机是相同的,但是因为有多条记录,因此存储的时候要注意存储的KEY值,这里用仓库ID来区分

window.addEventListener('beforeunload', () => {localStorage.setItem(`Pinia_${store.$id}`, JSON.stringify(store.$state))
})

取出数据

取数据的时候一样,也要根据不同的KEY值来取

  try {const state = JSON.parse(localStorage.getItem(`Pinia_${store.$id}`))if (state) {// 解析出来了之后就替换掉原来仓库的数据store.$pacth(state)}} catch (error) {console.log('存储的数据有误')}

完整代码

import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'
const pinia = createPinia()
const app = createApp(App)
pinia.use(piniaPlugin)
app.use(pinia)
app.mount('#app')
function piniaPlugin(context) {const { store } = contextwindow.addEventListener('beforeunload', () => {localStorage.setItem(`Pinia_${store.$id}`, JSON.stringify(store.$state))})try {const state = JSON.parse(localStorage.getItem(`Pinia_${store.$id}`))if (state) {// 解析出来了之后就替换掉原来仓库的数据store.$pacth(state)}} catch (error) {console.log('存储的数据有误')}
}
// Lorem ipsum dolor sit amet consectetur adipisicing elit. Autem, sed officia eum sit hic dicta voluptatibus tempora reiciendis praesentium dolor!

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

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

相关文章

YoloV8改进策略:下采样改进|自研下采样模块(独家改进)|疯狂涨点|附结构图

摘要 本文介绍我自研的下采样模块。本次改进的下采样模块是一种通用的改进方法,你可以用分类任务的主干网络中,也可以用在分割和超分的任务中。已经有粉丝用来改进ConvNext模型,取得了非常好的效果,配合一些其他的改进,发一篇CVPR、ECCV之类的顶会完全没有问题。 本次我…

【网站项目】平面设计课程在线学习平台系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

定风波:苏轼

定风波:苏轼 该片围绕诗文、书画、美食、旅游、民生等主题,多维度描绘苏东坡的为官之道、志趣审美和精神世界,深入解读苏东坡在21世纪的价值。 生平 1.出生于眉山 2.进京参加会考 3.母亲去世,回乡奔丧 4.开始担任官职 5.恰逢王…

《债务与国家的崛起》西方民主制度的金融起源 - 三余书屋 3ysw.net

债务与国家的崛起:西方民主制度的金融起源 你好,今天我们来聊聊由英国知名经济与金融历史学家詹姆斯麦克唐纳所著的《债务与国家的崛起》这本书。19世纪世界历史上发生了一次巨变,即“大分流”。当时西方通过工业革命实现了科技和经济的飞速…

Java 学习和实践笔记(51):二分法查找(折半检索)

二分法查找(折半检索)又叫binary search. 要在一堆数据中查找是否存在某一个已知数,二分法查找的步骤: 第一步,对数据实现排序 第二步,将该数与排序后的数据集的中间一个数进行比较 第三步,…

SAP S/4HANA的常见部署方式

SAP S/4HANA是SAP面向企业数字化转型推出一代商务ERP 套件,与传统的SAP ERP系统相比,它基于内存计算和先进的数据处理技术,提供更快的数据处理速度、实时分析和更好的用户体验。SAP S/4HANA可以根据企业的需求以多种部署方式进行实施&#xf…

《FPGA接口与协议》专栏的说明与导航

(1)为什么成了付费专栏? 知识付费时代,多做一些尝试免费内容非常容易被其他网站爬虫获取,付费是某种意义上的版权保护付费即意味着责任,有利于提高专栏质量,驱使作者对读者、对内容更负责 &…

Java项目实战笔记--基于SpringBoot3.0开发仿12306高并发售票系统--(二)项目实现-第二篇-前端模块搭建及单点登录的实现

本文参考自 Springboot3微服务实战12306高性能售票系统 - 慕课网 (imooc.com) 本文是仿12306项目实战第(二)章——项目实现 的第二篇,详细讲解使用Vue3 Vue CLI 实现前端模块搭建的过程,同时其中也会涉及一些前后端交互的实现&am…

分享webgl魔幻星球

界面截图 webgl 是在网页上绘制和渲染三维图形的技术,可以让用户与其进行交互。divcss、canvas 2d 专注于二维图形。 对公司而言,webgl 可以解决他们在三维模型的显示和交互上的问题;对开发者而言,webgl 可以让我们是实现更多、更…

[从零开始学习Redis | 第九篇] 深入了解Redis数据类型

前言: 在现代软件开发中,数据存储和处理是至关重要的一环。为了高效地管理数据,并实现快速的读写操作,各种数据库技术应运而生。其中,Redis作为一种高性能的内存数据库,广泛应用于缓存、会话存储、消息队列…

2024 极术通讯-小米SU7汽车智驾芯片一览

导读:极术社区推出极术通讯,引入行业媒体和技术社区、咨询机构优质内容,定期分享产业技术趋势与市场应用热点。 芯方向 一文读懂Cache一致性原理 本文详细阐述了Cache一致性的重要性和实现原理,特别是在多核系统中。文章解释了由…

栈的ADT实现——有空间限制的栈

1、研究有空间限制的栈的原因 当我们使用很多软件时都有类似“undo”功能,比如Web浏览器的回退功能、文本编辑器的撤销编辑功能。这些功能都可以使用Stack实现,但是在现实中浏览器的回退功能也好,编辑器的撤销功能也好,都有一定的数量限制。因此我们需要的不是一个普通的Sta…

Redis之缓存穿透、击穿、雪崩

一、缓存穿透 缓存穿透是指在使用缓存系统时,特定的查询在缓存和数据库中都找不到结果,导致每次查询都要访问数据库,从而增加数据库的压力,降低系统的性能,若黑客利用此漏洞进行攻击可能压垮数据库。 当一个查询请求经…

vue3监听div高宽变化自定义分析

resizeObserver.ts //对于对象的引用是弱引用,这意味着在没有其他引用存在时垃圾回收能正确进行。在取消引用时,不需要手动删除元素,因为它们会自动被垃圾回收。 const map new WeakMap();// ResizeObserver是一个构造函数,用于…

齐护机器人方位传感器指南针罗盘陀螺仪

一、方位传感器原理及功能说明 齐护方位传感器是一款集成了三轴磁传感器芯片的方位传感器模块。适用于无人机、机器人、移动和个人手持设备中的罗盘(指南针)、导航和游戏等高精度应用。模块可以感应XYZ平面角度外,还可实现1至2的水平面角度罗…

【精品教程】护网HVV实战教程资料合集(持续更新,共20节)

以下是资料目录,如需下载,请前往星球获取: 01-HW介绍.zip 02-HTTP&Burp课程资料.zip 03-信息收集_3.zip 04-SQL注入漏洞_2.zip 05-命令执行漏洞.zip 06-XSS漏洞.zip 07-CSRF.zip 08-中间件漏洞.zip 09-SSRF.zip 10-XXE.zip 11-Java反序列…

用栈实现队列-使用两个栈来实现队列,则使我们插入的元素依照先入先出原则即可

一、用栈实现队列 https://leetcode.cn/problems/implement-queue-using-stacks/ (一)分析题目 (二)编写代码 typedef char STDataType; typedef struct Stack {STDataType* a; //int top; //相当于数组下标,注意…

idea 中 大于等于,不等于、小于等于等等这些符号发生了改变问题解决方法

1.问题描述 idea 中&#xff01;变为 ≠、 >变成了≥、<变成了 ≤ 等问题的解决办法 展示效果如下截图 解决方法

富格林金业:认识分批建仓重要性

富格林金业指出&#xff0c;在现货黄金市场中&#xff0c;分批建仓是一种常见的投资策略。投资者学会运用多维权衡投资分批建仓的技巧可帮助我们有效控制风险&#xff0c;为投资者提供更稳健的投资体验。以下分享分批建仓的优势。 建仓进场的时候&#xff0c;不是一定要一次性建…

Spark 部署与应用程序交互简单使用说明

文章目录 前言步骤一&#xff1a;下载安装包Spark的目录和文件 步骤二&#xff1a;使用Scala或PySpark Shell本地 shell 运行 步骤3:理解Spark应用中的概念Spark Application and SparkSessionSpark JobsSpark StagesSpark Tasks 转换、立即执行操作和延迟求值窄变换和宽变换 S…