利用vuex解决keep-alive缓存后点击左侧菜单进行初始化,点击tab也缓存数据问题

项目中遇到这样一个需求,需要tab切换,对数据进行缓存,这个时候,我们会想到vue自带的keep-alive进行缓存;但是此时,点击左侧菜单,界面依然是上一次缓存的数据,这就不满足需求了。下面讲解下如果利用vuex来解决这个问题。

 

首先创建一个vuex的数据js文件

export default {
    namespaced: true,
    state: {
        // 页面缓存后初始化标记
        refreshPage: false // 标记是否初始化
    },
    mutations: {
        /**
              * @description 设置是否初始化
              * @param {Object} state state
              * @param {Object} log data
              */
        setRefreshPage (state, flag) {
            state.refreshPage = flag
        }
    }
}

1、在左侧菜单点击方法模块,增加如下代码

import { mapMutations } from 'vuex'
export default {
  methods: {
    ...mapMutations('d2admin/init', ['setRefreshPage']),
    handleMenuSelect (index, indexPath) {
      this.setRefreshPage(true)
      this.$router.push({
        path: index
      })
    }
  }
}

2、去相应的菜单点击模块编写代码(分为4步)

/** 新需求,点击菜单初始化*/
import { mapState, mapMutations } from 'vuex'
  /** 新需求,点击菜单初始化,*/
  activated () {
      console.log(this.refreshPage)
      if (this.refreshPage) {
          // 若为true,则执行重置页面等相关操作
          this.setRefreshPage(false)
          //这里写手动初始化的代码
      } else {
          console.log('点击菜单初始化')
      }
  },
  /** 新需求,点击菜单初始化,*/
  computed: {
      ...mapState('d2admin/init', [
          'refreshPage' // 映射 this.refreshSearch 为 this.$store.state.refreshSearch
      ])
  },
methods: {
    /** 新需求,点击菜单初始化,*/
    ...mapMutations('d2admin/init', ['setRefreshPage']),
}

完成到这里,你会发现需求基本满足,但是唯一不满足的,就是左侧菜单点击当前界面,界面不会初始化。

3、为了解决这个问题,这个时候,我们利用一个空界面来解决这个问题

创建一个vue文件

<!--此模块为空白页,点击左侧菜单为当前页,进行的过渡界面,再跳回原始页面-->
<template>
  <div></div>
</template>

<script>
    export default {
        name:'init',
        data(){
            return{
            }
        },
        beforeCreate() {
            let url = this.$route.query
            let str = ''
            for(let i in url){
                str += url[i]
            }
            console.log(str, 'index')
            this.$router.replace({
                path: str
            })
        }
    }
</script>

<style scoped>

</style>

然后去相应的路由模块引入这个界面的路由

最后完善我们第一步的步骤,在左侧菜单点击方法模块修改代码,(增加一个判断如果是当前界面就跳转空白页进行过渡)

import { mapMutations } from 'vuex'
export default {
  methods: {
    ...mapMutations('d2admin/init', ['setRefreshPage']),
    handleMenuSelect (index, indexPath) {
      /** 新需求,点击菜单初始化*/
      if(this.$route.path === index){
        this.setRefreshPage(true)
        this.$router.replace({
          path:'/init',
          query:index
        })
      }else{
        this.setRefreshPage(true)
        this.$router.push({
          path: index
        })
      }
    }
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值