vuex存储数组(新建,增,删,更新),并存入localstorage定时删除

news2024/12/25 9:46:16

vuex存储数组(新建,增,删,更新),并存入localstorage定时删除

本文目录

    • vuex存储数组(新建,增,删,更新),并存入localstorage定时删除
      • 使用背景
      • store中实现增删改
      • 组件中维护数组,进行判断
      • 存入localstorage并设置定时删除
        • 自定义实现
        • 使用storage-timing插件
      • 调用定时删除
      • 最终效果

使用背景

初始化一个完整数组,但在业务逻辑中会单独更新或增删其中的一部分或全部。

如果每次都是全部更新,直接使用set替换即可,但大部分数组不变只修改个别数据,直接替换的代价较大,因此维护一个增删改的业务。

原来的数据都是有意义的,新数据可能是初始化的,不能直接替换成新数据,新数据可能只是增删了id,但是其他数据内容还要继续使用旧数据的,所以只能在旧数据基础上进行维护

store中实现增删改

import Vue from "vue"
import Vuex from "vuex"

Vue.use(Vuex)

const store = new Vuex.Store({
  state: {
    list: [],
  },
  getters: {},
  mutations: {
    setList(state, list) {
      state.list = list;
    },
    addItem(state, item) {
      state.list.push(item);
    },
    updateItem(state, payload) {
      Vue.set(state.list, payload.index, payload.data);
    },
    deleteItem(state, lt) {
      let newIds = lt.map((item) => item.aid);
      state.list = state.list.filter((item) => newIds.includes(item.aid));
    },
  },
  actions: {}
})

export default store;

组件中维护数组,进行判断

对象数组数据格式

[
  { "aid": "1", "aname": "111", "tobid": "1" }
  { "aid": "2", "aname": "ddd", "tobid": "2" }
]

组件中判断

  1. 新建的时候进行判断that.list.length == 0 || that.list == null,直接set赋值即可
  2. 如果不为0,说明已经初始化并赋值,遍历当前数组(本文中数据来自后端)
    • id不存在(旧数组没有而新数组有),则调用add添加
    • id存在需要判断这个对象是否完全相同,不完全相同则调用update
  3. 最后调用delete,store中直接使用filter过滤掉新数组中有而旧数组没有的对象(delete的逻辑可以单独存在,不与更新一起)

自行修改使用:大更新需要add和delete,局部更新只有update

例如旧数组是【1,2】,新数组是【2,3】,经过第二步之后,旧数据变为【1,2,3】,但【1】是需要删除的

<template>
  <div class="form-all">
    <el-button @click="getList()">getList</el-button>
    <el-button @click="clearStorage()">clear Local Storage</el-button>
    <div v-for="(item) in list" :key="item.aid">{{ item }}</div>
  </div>
</template>

<script>
import { mapState, mapMutations } from "vuex";

export default {
  name: "demo",
  data() {
    return {
      lit: [],
    };
  },
  components: {},
  computed: {
    ...mapState(["list"]),
  },
  methods: {
    ...mapMutations(["setList", "addItem", "updateItem", "deleteItem"]),
    clearStorage() {
      // localStorage.setItem("list", []);
      localStorage.removeItem('list');  
    },
    getList() {
      console.log(this.list.length);
      let that = this;
      this.axios
        .get('/abc/onetooneAnnote')
        .then((response) => {
          //返回结果
          let lt = response.data;
          this.setStore(lt);
        })
        .catch((error) => {
          console.log(error)
        })
    },
    setStore(lt) {
      let that = this;
      if (that.list.length == 0 || that.list == null) {
        //初始化
        this.setList(lt);
      } else {
        let lit = that.list;
        lt.forEach((newItem, i) => {
          const index = lit.findIndex((litem) => litem.aid === newItem.aid);
          if (index == -1) {
            // 添加
            this.addItem(newItem);
          } else {
            const oldItem = lit[index];
            if (JSON.stringify(oldItem) != JSON.stringify(newItem)) {
              // 更新
              let payload = {
                data: newItem,
                index: index,
              }
              this.updateItem(payload);
            }
          }
        })
        //删除
        this.deleteItem(lt);
      }
    },
  },
  mounted() {
  },
  created() {},
  destroyed() {},
  watch: {},
}
</script>

<style scoped>
</style>

<style></style>

存入localstorage并设置定时删除

自定义实现

  1. 使用subscribe监听指定的mutation方法,对应方法调用则更新localstorage
  2. 实现函数setItemWithExpiry,将时间作为变量和数据整编成一个对象,存入localStorage,在subscribe时调用此函数
import Vue from "vue"
import Vuex from "vuex"

Vue.use(Vuex)

// 将数据存储到LocalStorage并设置过期时间(毫秒)
function setItemWithExpiry(key, value, ttl) {
  const item = {
    value: value,
    expiry: new Date().getTime() + ttl,
  };
  localStorage.setItem(key, JSON.stringify(item));
}

const store = new Vuex.Store({
  state: {
    list: JSON.parse(localStorage.getItem("list")) || [],
  },
  getters: {},
  mutations: {
    setList(state, list) {
      state.list = list;
    },
    addItem(state, item) {
      state.list.push(item);
    },
    updateItem(state, payload) {
      Vue.set(state.list, payload.index, payload.data);
    },
    deleteItem(state, lt) {
      let newIds = lt.map((item) => item.aid);
      state.list = state.list.filter((item) => newIds.includes(item.aid));
    },
  },
  actions: {}
})

// 监听订阅
store.subscribe((mutation, state) => {
  if (['setList', 'addItem', 'updateItem', 'deleteItem'].includes(mutation.type)) {
    // 不设置定时删除
    // localStorage.setItem('list', JSON.stringify(state.list));
    // 使用定时删除
    setItemWithExpiry("list", state.list, 10 * 1000);
  }
});

export default store;

使用storage-timing插件

官方github地址:https://github.com/xxwwp/StorageTiming/blob/main/docs/zh.md

调用定时删除

  1. 设置定时器,可以在App.vue中全局设置
  2. checkExpiry可以遍历全部localstorage,也可以只关注某几个变量
<template>
  ...
</template>

<script>
export default {
  data() {
    return {
      timer: "",
    }
  },
  components: {},
  methods: {
    getItemWithExpiry(key) {
      const itemStr = localStorage.getItem(key);
      if (!itemStr) {
        return null;
      }
      const item = JSON.parse(itemStr);
      const currentTime = new Date().getTime();
      if (currentTime > item.expiry) {
        // 如果数据已经过期,删除它
        localStorage.removeItem(key);
        return null;
      }
      return item.value;
    },
    // 检查LocalStorage中的数据是否过期
    checkExpiry() {
      this.getItemWithExpiry("list");
      // for (let i = 0; i < localStorage.length; i++) {
      //   const key = localStorage.key(i);
      //   getItemWithExpiry(key);
      // }
    },
    startCheck(){
      let that = this;
      this.timer = setInterval(() => { //开启定时器
        console.log("check localstorage");
        that.checkExpiry()
      }, 1000)
    }
  },
  mounted() {
    this.startCheck();
  },
  beforeDestroy(){
    clearInterval(this.timer)//组件销毁之前清掉timer
  },
  computed: {},
  created() {

  },

}
</script>

<style scoped></style>
<style></style>

最终效果

  • 初始化
  • 新增
  • 更新和删除
  • 谷歌浏览器查看localstorage(F12 --> Application -->Storage)
  • localstorage定时删除

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

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

相关文章

缩小数据文件

今天又出现12.2c 环境的问题&#xff0c;1T的数据空间还剩下2G&#xff0c;吓了一身冷汗&#xff0c;赶紧查看原因&#xff0c;不知道哪路业务大神作妖了。 发现sysaux和system增加N多数据文件&#xff0c;而且目前使用不多&#xff0c; 缩小表空间的数据文件 可以使用下面的语…

直升机空气动力学基础---002 桨叶的主要参数

源于 1.桨叶的平面形状和主要参数 由于其设计制造比较简单&#xff0c;早期直升机大多采用矩形桨叶&#xff0c;缺点是在高速气流中&#xff0c;无法抑制桨尖涡&#xff0c;会消耗向下的诱导速度&#xff0c;降低旋翼的拉力。现代多采用梯形桨叶。 桨尖后掠能够降低桨尖涡 …

【Linux】Linux基本指令(2)

一.你如何看待指令 指令说白了就是可执行程序&#xff0c;且指令一定是在系统的某一个位置存在的&#xff0c;在执行指令前&#xff0c;我们需要先找到它。 二.man指令 众所周知&#xff0c;Linux的指令有很多&#xff0c;指令的选项也有很多&#xff0c;我们不可能全记住&…

android注解注入AspectJ面向切面AOP插桩技术改变android原生类对象行为记录View点击事件,Java(3)

droid注解注入AspectJ面向切面AOP插桩技术改变android原生类对象行为记录View点击事件&#xff0c;Java&#xff08;3&#xff09; 动态改变Toast提示的内容&#xff0c;弹之前修改。Button在每次点击后记录。 import android.util.Log; import android.widget.Toast;import o…

基于天牛须(BAS)与NSGA-Ⅱ混合算法的交直流混合微电网多场景多目标优化调度(Matlab代码实现)

&#x1f4a5; &#x1f4a5; &#x1f49e; &#x1f49e; 欢迎来到本博客 ❤️ ❤️ &#x1f4a5; &#x1f4a5; &#x1f3c6; 博主优势&#xff1a; &#x1f31e; &#x1f31e; &#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 …

论Shell编程规范与变量

目录 一&#xff1a;shell脚本 1.shell概述 2.linux中包含的常用shell 3.shell脚本概述 4.shell脚本应用场景 5.shell脚本的作用 6.用户的登录shell 二&#xff1a; 编写脚本 1.脚本的基本格式 2.shell脚本的执行 3. 交互式硬件设备 4.重定向操作 5.管道操作符号 “…

信号完整性分析基础知识之传输线和反射(一):阻抗变化引起反射

阻抗不连续引起的反射和失真可能会导致信号的误触发和误码&#xff0c;这是导致信号失真和质量下降的主要原因。 在某些情况下&#xff0c;这看起来像振铃。当信号电平下降时&#xff0c;下冲会影响噪声预算并导致误触发。或者&#xff0c;在下降信号上&#xff0c;峰值可能会上…

阅读笔记 First Order Motion Model for Image Animation

文章解决的是图片动画的问题。假设有源图片和驱动视频&#xff0c;并且其中的物体是同一类的&#xff0c;文章的方法让源图片中的物体按照驱动视频中物体的动作而动。 文章的方法只需要一个同类物体的视频集&#xff0c;不需要而外的标注。 方法 该方法基于self-supervised策…

Qt信号槽原理

Qt之信号槽原理 一.概述 所谓信号槽&#xff0c;实际就是观察者模式。当某个事件发生之后&#xff0c;比如&#xff0c;按钮检测到自己被点击了一下&#xff0c;它就会发出一个信号&#xff08;signal&#xff09;。这种发出是没有目的的&#xff0c;类似广播。如果有对象对这…

idea无效的目标版本和类文件具有错误的版本 61.0, 应为 52.0错误(测试有用,一次性解决问题)

SpringBoot己更新到3后&#xff0c;使用的JAVA版本最低要求JAVA17&#xff0c;如果低于这个版本就是报错&#xff1a; 问题一&#xff1a;类文件具有错误的版本 61.0, 应为 52.0。 解决就只有升级JAVA-sdk&#xff1a; 官方下载地址&#xff1a;JAVA20-17 官方推荐更好的sd…

MySQL 视图、函数和存储过程

MySQL 是一种流行的关系型数据库管理系统&#xff0c;其具有强大的功能和灵活性&#xff0c;使其成为了许多企业和个人喜爱的数据库选择。在 MySQL 中&#xff0c;视图、函数和存储过程是常见的数据库对象&#xff0c;它们都有助于提高数据的处理效率和可重用性。 一、视图 视…

UE5实现Runtime环境下绘制点功能

文章目录 1.实现目标2.实现过程2.1 C++实现2.2 蓝图调用3.参考资料1.实现目标 UE5在Runtime环境下基于PDI绘制点,GIF动态如下: 2.实现过程 UE常用的在运行时环境下绘制点方法主要有两种。一种是基于Mesh,即添加Sphere等StaticMesh来模拟显示绘制点;另一种是基于Primitive的…

用代码实现标签打印的三种方式

最近项目中要实现标签打印的功能&#xff0c;有几个条件 标签模板可以事先生成&#xff0c;用的是CodeSoft软件标签模板里面有二维码标签模板里面有一些变量&#xff0c;要求打印的时候自动填充产线电脑上没有安装CodeSoft&#xff0c;即便安装也不能使用&#xff0c;因为没有…

Java线程池及拒绝策略详解

前文提到线程的使用以及线程间通信方式&#xff0c;通常情况下我们通过new Thread或者new Runnable创建线程&#xff0c;这种情况下&#xff0c;需要开发者手动管理线程的创建和回收&#xff0c;线程对象没有复用&#xff0c;大量的线程对象创建与销毁会引起频繁GC&#xff0c;…

Unity入门(一)

Unity Unity是一套完善体系与编辑器的跨平台游戏开发工具&#xff0c;也可以称之为游戏引擎。游戏引擎是指一些编写好的可以重复利用的代码与开发游戏所用的各功能编辑器。 基于C#编程&#xff0c;易上手&#xff0c;高安全性独特的面向组件游戏开发思想让游戏开发更加简单易…

Maven 如何下载依赖包的源码包

使用Maven下载依赖包的时候&#xff0c; 默认是不会下载源码包的&#xff0c;但是有时候&#xff0c; 需要Debug代码&#xff0c;或是看看依赖项的源码的写法&#xff0c; 就需要下载源码包了。 这里以 Apache 的 commons-text 为例&#xff0c; 在Maven中添加如下依赖配置&am…

pwlink用作USB转TTL,进入HC-05的AT模式

不说废话的文章概括&#xff1a; 直接连接PWLINK与HC-05&#xff0c;无法进入AT模式&#xff0c;因为蓝牙模块的VCC只能接5V&#xff0c;不能接3.3V&#xff0c;而且PWLINK有两个VDD引脚&#xff0c;且两个VDD引脚初始默认输出电压都是3.3V&#xff0c;所以需要将3.3V改为5V的…

【JavaEE】网络通信中的一些基本概念及协议分层

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE初阶 互联网是怎么来的&#xff1f;很多先进技术&#xff0c;都是先军用&#xff0c;用了之后太香了才逐渐民用~~ 互联网也是如此&#xff0c;互联网之前&#xff0c;可以通过有线/无线&#xf…

单链表——“数据结构与算法”

各位CSDN的uu们你们好呀&#xff0c;今天&#xff0c;小雅兰的内容终于是我们心心念念的单链表啦&#xff0c;这一块呢&#xff0c;是一个很重要的部分&#xff0c;也是一个对目前的我来说&#xff0c;比较困难的部分&#xff0c;下面&#xff0c;就让我们进入单链表的世界吧 之…

【unity项目实战】3DRPG游戏开发04——导航、人物移动和鼠标指针图片替换

AI导航烘培 还不清楚怎么用的可以看我另一篇文章 零基础带你从小白到超神29——导航系统 将地形调成静态导航的 选中地形,设置为可行区域 点击烘培 可爬坡改为30度,就会发现坑就变为不可行区域了 选择所有的树,为不可行区域,点击烘培 给主角人物添加导航组件