解决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!
相关文章:
解决Vue中仓库持久化的问题,不借助插件用原生JS实现仓库持久化。了解仓库的插件机制、监听的时机
1、演示 前言:目前Vue有两种仓库,一种是Vuex,一种是Pinia,懂得都懂,这里就不详细介绍这两者的区别了 2、什么是持久化 仓库里面的数据是需要跨越页面周期的,当页面刷新之后数据还在,在默认情况下…...
ajax的优缺点有哪些?
我们先来介绍一下什么是ajax: 对于ajax的理解,ajax是一种使用现有技术集合技术内容包括: HTML或XHTML、CSS、 JavaScript、DOM、XML、 XSLT, 以及最重要的XMLHttpRequest。 用于浏览器与服务器之间使用异步数据传输(HTTP请求),做…...
自贡市第一人民医院:超融合与 SKS 承载 HIS 等核心业务应用,加速国产化与云原生转型
自贡市第一人民医院始建于 1908 年,现已发展成为集医疗、科研、教学、预防、公共卫生应急处置为一体的三级甲等综合公立医院。医院建有“全国综合医院中医药工作示范单位”等 8 个国家级基地,建成高级卒中中心、胸痛中心等 6 个国家级中心。医院日门诊量…...
vue使用iview导航栏Menu activeName不生效
activeName不生效 一、问题一、解决方案, 一、问题 根据ivew官网的提示,设置了active-name和open-names以后,发现不管是设置静态是数据还是设置动态的数据,都不生效 一、解决方案, 在设置动态名称的时候,…...
谷粒商城实战(008 缓存)
Java项目《谷粒商城》架构师级Java项目实战,对标阿里P6-P7,全网最强 总时长 104:45:00 共408P 此文章包含第151p-第p157的内容 简介 数据库承担落盘(持久化)工作 拿map做缓存 这种是本地缓存,会有一些问题 分布…...
python的相关语法
Day01 1.Python是什么语言 python是解释性语言,什么为编译?1.生成目标文件,编译型语言在程序执行之前,先会通过编译器对程序执行一个编译的过程,把程序转变成机器语言。运行时就不需要翻译,而直接执行就行。…...
【面试经典150 | 动态规划】最小路径和
文章目录 写在前面Tag题目来源解题思路方法一:动态规划方法二:空间优化 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更…… 专栏内容以分析题目为主,并附带一些对于本题…...
生成式AI的情感实验——AI能否产生思想和情感?
机器人能感受到爱吗?这是一个很好的问题,也是困扰了科学家们很多年的科学未解之谜。虽然我们尚未准备好向智能机器赋予情感,但智能机器却已经可以借助生成式人工智能(AI)来帮助我们表达自己的情感。 自然情感表达 AI正…...
力扣贪心算法--第一天
前言 今天是贪心算法的第一天,算法之路重新开始! 内容 之前没了解过贪心算法。 什么是贪心 贪心的本质是选择每一阶段的局部最优,从而达到全局最优。难点就是如何通过局部最优,推出整体最优。 一、455.分发饼干 假设你是一…...
Nginx反向代理和缓存
一、Nginx反向代理 1.调度和代理的区别: 1.调度基于内核层面,代理基于应用层面 2.代理必须实现一手托两家 3.调度不需要监听任何端口,不需要工作任何应用程序,代理需要工作和上游服务器一模一样的进程 4.调度没有并发上限&am…...
支持多元AI场景应用,宁畅“NEX AI Lab”开放试用预约中
3月29日,宁畅在京举行发布会,正式发布“全局智算”战略,并在会上推出战略性新品“AI算力栈”,旨在有效解决大模型产业落地的全周期问题。 据宁畅CTO赵雷介绍,“AI算力栈”集成了宁畅在AI计算领域的软硬件能力ÿ…...
Git 如何合并多个连续的提交
我平常的编程喜欢是写一段代码就提交一次,本地一般不攒代码,生怕本地有什么闪失导致白干。但这样就又导致一个问题:查看历史日志时十分不方便,随便找一段提交可以看到: > git log --oneline 8f06be5 add 12/qemu-h…...
k8s 基础入门
1.namespace k8s中的namespace和docker中namespace是两码事,可以理解为k8s中的namespace是为了多租户,dockers中的namespace是为了网络、资源等隔离 2.deployment kubectl create #新建 kubectl aply #新建 更新 升级: 滚动升级&#x…...
【Python项目】AI动物识别工具
目录 背景 技术简介 系统简介 界面预览 背景 成像技术在全球科技发展中扮演了关键角色。在科学研究领域,拍摄所得的图像成为了一种不可或缺的研究工具。特别是在生态学与动物学研究中,鉴于地球的广阔地域和多样的气候条件,利用图像技术捕…...
逻辑回归(Logistic Regression)详解
逻辑回归是一种用于解决二分类问题的统计方法,它通过构建一个模型来预测某个事件的概率。 以下是逻辑回归的一些关键要点: 适用场景:逻辑回归特别适合于处理二分类问题,即两个类别的分类问题,例如判断一封邮件是否为…...
.vimrc文件的语句语法
本文结构: a、简介 b、详细解释其中的一些常见语句和语法。 a、.vimrc 文件是 Vim 编辑器用于配置用户设置和自定义行为的文件。当 Vim 启动时,它会读取 .vimrc 文件中的命令和设置,并根据这些指令来配置编辑器的行为。 b、.vimrc 文件中…...
c语言之函数指针作形参
在一些c语言的大工程中,会在定义的函数中,把一些其他函数指针作为本函数形参。 函数指针作形参的例子 代码如下: #include<stdio.h> int max(int a,int b) { return(a>b?a:b); } int min(int a,int b) { return(a<b?a:b); } i…...
python文件的读取操作
打开文件 fopen("F:/python/helloworld/测试.txt","r",encoding"UTF-8")读取文件 print(f"读取10个字节的结果{f.read(10)}") print(f"读取全部字节的结果{f.read()}") linesf.readlines() print(f"{lines}")读…...
查看并设定【网络适配器】的优先级(跃点数)
目录 前言: 1.查看所有的适配器 2.修改优先级(需要以管理员身份运行) 跃点数(InterfaceMetric ) DHCP 3.修改后的效果 pwoerShell 再次运行之前的程序 4.其他 参考 网络适配器1,8相关知识介绍1 …...
深入理解 Hadoop 上的 Hive 查询执行流程
在 Hadoop 生态系统中,Hive 是一个重要的分支,它构建在 Hadoop 之上,提供了一个开源的数据仓库系统。它的主要功能是查询和分析存储在 Hadoop 文件中的大型数据集,包括结构化和半结构化数据。Hive 在数据查询、分析和汇总方面发挥…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...
Python常用模块:time、os、shutil与flask初探
一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...
