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

这篇具有很好参考价值的文章主要介绍了vuex存储数组(新建,增,删,更新),并存入localstorage定时删除。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

使用背景

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

如果每次都是全部更新,直接使用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) {
        //初始化
        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并设置定时删除

不刷新页面,使用的vuex内的值,刷新页面才会重新从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")).value || [],
  },
  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;

其中获取vuex的值,如果每次都想直接从localstorage中读取,可以使用store的getters属性

  getters: {
    getList: (state) => {
      return state.list;
    },
  },

组件中使用

<div v-for="(item) in getList" :key="item.aid">{{ item }}</div>

import { mapGetters } from "vuex";

  computed: {
    ...mapGetters(['getList']),
  },
使用storage-timing插件

官方github地址:https://github.com/xxwwp/StorageTiming/blob/main/docs/zh.md文章来源地址https://www.toymoban.com/news/detail-425645.html

调用定时删除

  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>

最终效果

  • 初始化
    vuex存储数组(新建,增,删,更新),并存入localstorage定时删除
  • 新增
    vuex存储数组(新建,增,删,更新),并存入localstorage定时删除
  • 更新和删除
    vuex存储数组(新建,增,删,更新),并存入localstorage定时删除
  • 谷歌浏览器查看localstorage(F12 --> Application -->Storage)
    vuex存储数组(新建,增,删,更新),并存入localstorage定时删除
  • localstorage定时删除
    vuex存储数组(新建,增,删,更新),并存入localstorage定时删除

到了这里,关于vuex存储数组(新建,增,删,更新),并存入localstorage定时删除的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 原生JavaScript实现本地存储(localStorage)和会话存储(sessionStorage)

    目录 一、简单介绍 二、localStorage本地存储 三、sessionStorage会话存储 本地存储和会话存储的目的,是将所输入的文件存入到浏览器中,在需要的时候,直接调用,但是本地存储和会话存储有着一定的区别,本地存储,在不主动删除的情况下,会一直保留在浏览器中,会话存储是

    2023年04月08日
    浏览(43)
  • Vue中如何进行本地存储(LocalStorage)

    在Vue.js应用程序中,本地存储(LocalStorage)是一个强大的工具,用于在浏览器中保存和检索数据。它允许您在不使用服务器或后端数据库的情况下,在用户的浏览器中存储数据,以实现数据的持久性。本地存储对于保存用户首选项、用户身份验证令牌、购物车数据等场景都非

    2024年02月07日
    浏览(46)
  • HarmonyOS—LocalStorage:页面级UI状态存储

    LocalStorage是页面级的UI状态存储,通过@Entry装饰器接收的参数可以在页面内共享同一个LocalStorage实例。LocalStorage也可以在UIAbility实例内,在页面间共享状态。 本文仅介绍LocalStorage使用场景和相关的装饰器:@LocalStorageProp和@LocalStorageLink。 说明 本模块从API version 9开始支持。 L

    2024年02月22日
    浏览(42)
  • 鸿蒙Harmony--LocalStorage--页面级UI状态存储详解

    走的太急疼的是脚,逼的太紧累的是心,很多时候,慢一点也没关系,多给自己一些耐心和等待,保持热爱,当下即是未来,生活自有安排!  目录 一,定义 二,@LocalStorageProp定义 三,@LocalStorageProp装饰器使用规则说明  四,@LocalStorageProp变量的传递/访问规则说明  五,@Loc

    2024年01月20日
    浏览(44)
  • 利用HTML5存储对象:localStorage和sessionStorage解析

    前端朋友们,你是否曾为如何在用户的浏览器中存储数据而感到困扰?你是否想过,如果可以在用户的浏览器中存储一些数据,那么我们的应用程序将会变得多么强大?如果你的答案是肯定的,那么本文将为你解锁一种新的能力——使用HTML5的localStorage和sessionStorage。 HTML5引入

    2024年02月05日
    浏览(35)
  • 【温故而知新】HTML5存储localStorage/sessionStorage

    HTML5是HTML的最新版本,它引入了许多新的元素和功能,以适应现代网页开发的需求。以下是HTML5的一些主要特点: 新增语义元素 :HTML5引入了许多新的语义元素,如 header、footer、article、section 等,这些元素有助于提高网页的结构化和可访问性。 媒体支持 :HTML5引入了 audio 和

    2024年01月18日
    浏览(56)
  • 前端数据存储系列(Cookie、Session、localStorage、sessionStorage、Token)

    简述: Session比Cookie安全,Session是存储在服务器端的,Cookie是存储在客户端的 背景: HTTP 是无状态协议,说明它不能以状态来区分和管理请求和响应。也就是说,服务器单从网络连接上无从知道客户身份。 于是想说客户端们颁发一个通行证吧,每人一个,无论谁访问都必须

    2023年04月24日
    浏览(42)
  • C语言 读取TXT文件并存入结构体数组

    要读取的文件:(数据之间以制表符分割)  定义结构体 文件读取并存入结构体数组:  完整代码:

    2024年02月12日
    浏览(42)
  • 【微信小程序】使用云存储存入指定文件夹

    在我们开发微信小程序的时候常会用到 云开发 的功能,它相 比传统的SQL上手难度低 ,比较适合没有什么后端基础的开发者使用。在具体的项目需求中我们会 让用户上传一些图片或者表格,随着用户量增大,文件类型增多,云存储分类显得尤其重要 。下面我举一个例子来带

    2024年02月12日
    浏览(50)
  • 用c语言如何用二维数组存入多个字符串

    用 c 语言如何用二维数组存储多个字符串呢? 首先,需要确定要存储的字符串的个数和每个字符串的长度。然后定义一个二维数组,其中第一维表示字符串的个数,第二维表示每个字符串的长度。 例如,假设要存储 3 个字符串,每个字符串的长度都是 10,则可以使用如下代

    2024年02月05日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包