首页 > 网络编程 > JavaScript > javascript类库 > vue.js > vuex存储数组存入localstorage定时删除

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

作者:anjushi_

这篇文章主要介绍了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" }

组件中判断

  • 新建的时候进行判断that.list.length == 0 || that.list == null,直接set赋值即可
  • 如果不为0,说明已经初始化并赋值,遍历当前数组(本文中数据来自后端)
  • id不存在(旧数组没有而新数组有),则调用add添加
  • id存在需要判断这个对象是否完全相同,不完全相同则调用update
  • 最后调用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>
</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中获取

自定义实现

  • 使用 subscribe 监听指定的 mutation 方法,对应方法调用则更新 localstorage
  • 实现函数 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

调用定时删除

  • 设置定时器,可以在App.vue中全局设置
  • 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定时删除

到此这篇关于vuex存储数组(新建,增,删,更新),并存入localstorage定时删除的文章就介绍到这了,更多相关vuex存储数组内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
  • vue中watch监听对象中某个属性的方法
    vue中watch监听对象中某个属性的方法
    2023-04-04
  • 如何使用vue实现前端导入excel数据
    如何使用vue实现前端导入excel数据
    2023-04-04
  • vue 监听是否切屏和开启小窗的实现过程
    vue 监听是否切屏和开启小窗的实现过程
    2023-04-04
  • vue3如何实现​6位支付密码输入框
    vue3如何实现​6位支付密码输入框
    2023-04-04
  • vuex存储数组(新建,增,删,更新)并存入localstorage定时删除功能实现
    vuex存储数组(新建,增,删,更新)并存入localstorage定时删除
    2023-04-04
  • vue3+ts数组去重方及reactive/ref响应式显示流程分析
    vue3+ts数组去重方及reactive/ref响应式显示流程分析
    2023-04-04
  • vue3新拟态组件库开发流程之table组件源码分析
    vue3新拟态组件库开发流程之table组件源码分析
    2023-04-04
  • Element基于el-input数字范围输入框的实现
    Element基于el-input数字范围输入框的实现
    2023-04-04
  • 美国设下计谋,用娘炮文化重塑日本,已影响至中国
    美国设下计谋,用娘炮文化重塑日本,已影响至中国
    2021-11-19
  • 时空伴随者是什么意思?时空伴随者介绍
    时空伴随者是什么意思?时空伴随者介绍
    2021-11-09
  • 工信部称网盘企业免费用户最低速率应满足基本下载需求,天翼云盘回应:坚决支持,始终
    工信部称网盘企业免费用户最低速率应满足基本下载需求,天翼云盘回应:坚决支持,始终
    2021-11-05
  • 2022年放假安排出炉:五一连休5天 2022年所有节日一览表
    2022年放假安排出炉:五一连休5天 2022年所有节日一览表
    2021-10-26
  • 电脑版 - 返回首页

    2006-2023 脚本之家 JB51.Net , All Rights Reserved.
    苏ICP备14036222号