vue3,pinia状态管理,手写插件实现持久化

news2024/11/22 22:10:25

状态管理和持久化

先简单概述一下状态管理和持久化

  • 状态管理:使任意两个组件共享数据
  • 持久化:将共享的数据保存在本地,不随页面销毁而消失

         要实现状态的持久化,可以直接采用插件的形式实现,插件其实就是一个函数,所以根据这些原理,可以手写一个函数将数据保存在本体,重启页面时优先读取出来,这就是一个持久化插件的功能

persist.js

要实现持久化的效果,重点在两个功能:1.保存数据;2.优先读取

首先安装好pinia 并准备一个简单的store,可以参考:vue3状态管理,pinia的使用_vue3usestore的用法 pinia-CSDN博客

npm install pinia
import {defineStore} from 'pinia'

export const useStore = defineStore('counter', {
    state: () => {
        return {
            // 定义状态
            counter: 0
        }
    },
    // 定义计算属性
    getters: {
        // 定义计算属性
        getCounter: (state) => {
            return state.counter>=5?state.counter:"数据不足"
        }
    },
    // 定义操作
    actions: {
        // 定义操作
        addCounter() {
            this.counter++
        }
    }
    // 定义其他选项
    // ...
})
import {defineStore} from 'pinia'
import {ref,computed} from 'vue'

export const useStore = defineStore('counter', ()=>{
    const counter = ref(0);
    
    const getCounter = computed(() => {
        return counter.value>=5?counter.value:"数据不足"
    })
    const addCounter = () => {
        counter.value++
    }
    return{
        counter,
        getCounter,
        addCounter
    }
})

这是两个书写风格,这里采用更简洁的第二种作为示例,

在src下新建一个plugins文件夹,在新建一个js文件persist.js这个js文件就是持久化插件

在main.js中使用插件

import './assets/main.css'

import { createApp } from 'vue'
import App from './App.vue'
import { createPinia } from 'pinia'

import persist from './plugins/persist' //引入插件

const app = createApp(App);
const pinia = createPinia();

pinia.use(persist);// 注册持久化插件
app.use(pinia);
app.mount('#app');

persist插件

在persist插件中,有一个参数,store状态的上下文 

export default function(context){
  console.log(context);
}

注意几个关键的值,正好对应了,pinia中的状态存储,

这里分享一下关于响应式值在控制台的打印,开启这个设置就可以直接查看到响应式值中的内容,而不用去一级一级点开才能看到,

将state数据保存

export default function(context){
  console.log(context);
  const key = context.store.$id
  // 将数据保存在本地
  window.addEventListener('beforeunload', () => {// 页面关闭前执行
    localStorage.setItem(key, JSON.stringify(context.store.$state))
  })
}

使用store仓库的名称,也就$id的值作为key,将state里的值保存,这里监听了窗口的关闭事件,

当窗口关闭时,就会将store中的值保存下来

这里点击了4次按钮后,刷新页面,这个数据就存入了本地,

将state数据读取

export default function(context){
  console.log(context);
  const key = context.store.$id
  // 将数据保存在本地
  window.addEventListener('beforeunload', () => {// 页面关闭前执行
    localStorage.setItem(key, JSON.stringify(context.store.$state))
  })
  // 读取本地数据
  try{
    const data = JSON.parse(localStorage.getItem(key))
    if(data){
      context.store.$state = data
    }
  }catch(e){
    console.log("本地数据读取失败");
  }
}

因为这个插件是在main.js中启用的,所以它会在整个页面渲染前执行,这样就能将本地的数据读取并存入到store中,

这样就实现了一个持久化插件,

总结

全局插件的执行流程:在main.js中注册--->页面打开时执行(在页面维渲染时就已经执行了),

        一个插件其实就是实现某个功能的函数方法,并不是只有十分复杂的结构才能称为插件,当我们使用插件时,在理解了功能之后就可以尝试自己来实现

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

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

相关文章

民生银行北京分行金融科技校招面试记录

本文介绍2024届春招中,中国民生银行下属北京分行的金融科技岗位1场面试的基本情况、提问问题等。 2024年04月投递了中国民生银行下属北京分行的金融科技岗位,暂时不清楚所在部门。目前完成了一面与终面,在这里记录一下面试的相关经历。 首先&…

UFS协议—新手快速入门(四)【10】

目录 十、UPIU数据包格式详解 1、Transaction Type(类型) 2、Flags(附加信息) 其它 3、LUN(逻辑单元号): 4、Task Tag(任务标签): 5、Command Type&…

你还不知道Modbus RTU???

1. 什么是Modbus RTU Modbus RTU(Remote Terminal Unit)是Modbus通信协议的一种变种,用于串行通信。它是一种常见的工业控制系统通信协议,通常用于采集传感器数据、控制执行器和监控设备状态。Modbus RTU采用二进制编码&#xff0…

突破Web3红海,DePIN如何构建创新生态系统?

撰文:TinTinLand 本文来源香港Web3媒体Techub News专栏作者TinTinLand 2023 年 DePIN 赛道的火热成为 Web3 行业的重点关注方向,当前如何以可扩展、去中心化、安全方式推动 DePIN 赛道赋能下的 AI 版图建设,寻找更多 Web3 行业创新机遇成为…

静电场的基本方程

目录 场积分方程 通量(高斯定理) 环量 场微分方程 散度 旋度 小结 补充知识 立体角 场积分方程 通量(高斯定理) 环量 场微分方程 散度 旋度 小结 补充知识 立体角

打开自动联网,设置静态IP

TYPEEthernet PROXY_METHODnone BROWSER_ONLYno BOOTPROTOstatic # 设置为static DEFROUTEyes IPV4_FAILURE_FATALno IPV6INITyes IPV6_AUTOCONFyes IPV6_DEFROUTEyes IPV6_FAILURE_FATALno IPV6_ADDR_GEN_MODEstable-privacy NAMEens18 UUIDce34dd13-05cb-4d6d-95e4-252355b1…

c++网络通信

TCP/IP协议 OSI参考模型采用分层划分原则,将网络中的数据传输划分为7层,其中,物理层居于最下层,是最基础、核心的网络硬件层;应用层居于最上层,负责应用资源的管理。每一层使用下层的服务,并向…

内存卡数据移走了怎样恢复?简易步骤与解决方案

随着科技的快速发展,内存卡已成为我们日常生活中不可或缺的一部分,特别是在行车记录仪、手机、相机等设备上。然而,当内存卡中的数据意外移走或删除时,我们往往会感到焦虑和困惑。本文将为您介绍如何简易恢复内存卡中移走的数据&a…

[leetcode]valid-triangle-number. 有效三角形的个数

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int triangleNumber(vector<int>& nums) {int n nums.size();sort(nums.begin(), nums.end());int ans 0;for (int i 0; i < n; i) {for (int j i 1; j < n; j) {int left j 1, righ…

文件上传漏洞---Pyload

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 本文重点从靶场案例分析文件上传漏洞常见的Pylod&#xff0c;本文演示靶场upload-labs 一.文件类型---Pyload 不同的文件对应不同的文件类型&#xff0c;后端代码通过限制特定的文件类型…

618首战大捷!西圣Mike无线领夹麦克风全平台秒空!全网直接卖断货!

​在今年618购物狂欢节的首轮激战中&#xff0c;西圣Mike无线领夹麦克风以其卓越的品质和出色的性能以及高性价比&#xff0c;在全平台掀起了一股抢购热潮&#xff0c;实现了令人瞩目的“秒空”壮举&#xff0c;全网直接卖断货&#xff01; 不得不说西圣Mike是真的牛&#xff0…

Python 参数类型

一 理解Python中的Parameters & Arguments Parameters&#xff1a;形参 Arguments&#xff1a;实参 二 Python的实参&#xff08;Arguments&#xff09;类型 实参类型总结 位置参数&#xff08;Positional Arguments&#xff09; &#xff1a;函数调用时通过入参的顺序来…

JAVA每日作业day6.25

ok了家人们今天我们学习了&#xff0c;接口这个知识&#xff0c;我们闲话少叙&#xff0c;一起看看吧。 一&#xff0c;接口 1.1 接口概述 接口是功能的集合。接口的内部主要就是定义方法&#xff0c;包含常量&#xff0c;抽象方法&#xff08;JDK 7及以前&#xff09;&#…

让我们聊聊网络安全中会涉及到的IP地址(IP协议)、MAC地址、路由、DNS协议(域名系统)、NAT技术(协议)、以太网帧、ARP协议

网络安全中会涉及到的IP地址&#xff08;IP协议&#xff09;、MAC地址、路由、DNS协议&#xff08;域名系统&#xff09;、NAT技术&#xff08;协议&#xff09;、以太网帧、ARP协议 一.IP地址&#xff08;IP协议&#xff09;1.IP地址&#xff08;IP协议&#xff09;的作用2.IP…

第一百二十六节 Java面向对象设计 - Java枚举类

Java面向对象设计 - Java枚举类 枚举类型的超类 编译枚举类型时&#xff0c;编译器会创建一个类。 枚举类型可以具有构造函数&#xff0c;字段和方法。枚举类型仅在编译器生成的代码中实例化。 每个枚举类型都隐式地扩展java.lang.Enum类。 Enum类中定义的所有方法都可以与…

SAP 初始化库存移动类型561501511区别简介

项目上线初始化库存经常会用到561这个移动类型&#xff0c;同时我们在平时测试的过程中也会用到会进行库存的初始化&#xff0c;用的比较多是就是561和501这两个移动类型&#xff0c;本文将测试移动类型561&501&511这三个移动类型&#xff0c;分析三者之间的区别&#…

【图像处理实战】去除光照不均(Python)

这篇文章主要是对参考文章里面实现一种小拓展&#xff1a; 可处理彩色图片&#xff08;通过对 HSV 的 V 通道进行处理&#xff09;本来想将嵌套循环改成矩阵运算的&#xff0c;但是太麻烦了&#xff0c;而且代码也不好理解&#xff0c;所以放弃了。 代码 import cv2 import …

一分钟彻底掌握Java多线程生产者与消费者模型

代码 package com.example.KFC; public class Cooker extends Thread { public void run() { while (true) { synchronized (Desk.lock) { if (Desk.maxCount 0) { break; } else { if (!Desk.flag) { System.out.println("Cooker makes a hamburger"); …

MIGO增强(扩展字段,屏幕增强字段,常规保存增强)

1.MIGO前台增强: 1.SE18找到增强点:MB_GOODSMOVEMENT 2.找到相应的BADI:右键创建实施 3.找到重写的方法 METHOD if_ex_mb_document_badi~mb_document_before_update.DATA:lv_stat TYPE c,lv_type TYPE bapi_mtype,lv_msg TYPE bapi_msg.DATA:lv_message TYPE string.IF sy-t…

Ubuntu24.04下安装docker,并pull ubuntu22.04,然后编译安装vpp

一、docker安装说明 解决官方源无法下载的问题 二、使用步骤 1.更新软件包索引 sudo apt update2.安装必要的软件包&#xff0c;以允许apt通过HTTPS使用仓库 sudo apt install apt-transport-https ca-certificates curl software-properties-common3.添加Docker的官方GPG…