通过vuex控制vue缓存页面

4 篇文章 0 订阅
1 篇文章 0 订阅

首先是主要逻辑文件=>vuex页面keepAliveCtrls.js:

const state = {
	include_arr: []
}

const getters = {
	get_clude_arr: state_ => state_.include_arr
}

const mutations = {
	setinclude_arr(state_,data) {
		state_.include_arr = data
	}
}

const actions = {
	add_routes({commit}, data=[]) {
		console.log(state)
		const include_arr = [...state.include_arr];
		if(include_arr.length>=0 && typeof(data) === 'string') {
			if(!include_arr.includes(data)) {
				include_arr.push(data);
				commit('setinclude_arr',include_arr);
			}
		}
	},

	remove_target_route({commit},data) {
		const include_arr = [...state.include_arr];
		if(include_arr.length>0 && typeof(data) === 'string') {
			if(include_arr.includes(data)) {
				include_arr.splice(include_arr.indexOf(data),1);
				commit('setinclude_arr',include_arr);
			}
		}
	},

	remove_all_routes({commit}, data) {
		commit('setinclude_arr',[])
	}
};

export default {
	state,
	mutations,
	getters,
	actions,
};

store/index.js:

import Vue from 'vue'
import Vuex from 'vuex'
import keepAliveCtrl from './modules/keepAliveCtrls.js'
Vue.use(Vuex)


const store = new Vuex.Store({
  modules:{
    keepAliveCtrl
  },
  strict: process.env.NODE_ENV !== 'production' // 严格模式
})

export default store;

App.vue(在router-view写v-show控制,可以不用在组件文件把组件名写上)

v-show的其他条件视具体情况而定,请自行判断

<template>
	<div id="app">
        {{get_clude_arr}}
		<keep-alive :include="get_clude_arr">
		    <router-view v-show="get_clude_arr.length>0&&$route.name===get_clude_arr[get_clude_arr.length-1]"></router-view>
		</keep-alive>
        <router-view v-show="!(get_clude_arr.length>0&&$route.name===get_clude_arr[get_clude_arr.length-1])"></router-view>
	</div>
</template>

<script>
    import {mapGetters, mapActions} from 'vuex'
	export default {
        computed:{
            ...mapGetters(['get_clude_arr'])
        },
        mounted() {
            console.log(this.get_clude_arr)
        }
	};
</script>

<style lang="stylus" scoped>
</style>
<template>
	<div id="app">
      {{get_clude_arr}}
		<keep-alive :include="get_clude_arr">
			<router-view></router-view>
		</keep-alive>
	</div>
</template>

<script>
    import {mapGetters, mapActions} from 'vuex'
	export default {
        computed:{
            ...mapGetters(['get_clude_arr'])
        },
        mounted() {
            console.log(this.get_clude_arr)
        }
	};
</script>

<style lang="stylus" scoped>
</style>

// 注意:若是在keep-alive写:include=get_clude_arr,注意要在组件内写好组件的名称

/*

include:  字符串或正则表达式,只有名称匹配的组件会被缓存
exclude: 字符串或正则表达式,名称匹配的组件不会被缓存》
max:     数字,最多可以缓存多少组件实例

生命周期:
  activated和deactivated会在keep-alive树内所有嵌套的组件中触发
  如:B页面是缓存页面
    当A页面跳到B页面时,B页面的生命周期:activated(可在此时更新数据)
    B页面跳出时,触发deactivated
    B页面自身刷新时,会触发created-mouted-activated

*/

 

想要缓存todo页面,就使用todo页面的路由配置的name值:

<template lang="">
  <div>
    this is login page
    <p @click="aa">app</p>
  </div>
</template>
<script>
	import { mapActions } from "vuex";
	export default {
    name: 'login',
    created() {
      this.remove_target_route('todo')
    },
		methods: {
			...mapActions(["add_routes",'remove_target_route']),
			aa() {
        this.add_routes("todo");
          console.log(this.$store.state.keepAliveCtrl.includeArr)
          this.$router.push({
					name: "todo"
				});
			}
    },
    activated() {
      this.remove_target_route('todo')
    }
	};
</script>
<style lang="stylus"></style>

这样就不必去路由文件配置是否缓存了,而且在路由文件配置是否缓存的参数有局限性,修改在路由钩子中修改还是非常繁琐的,使用vuex能够起到动态控制的效果

 

补充一点小知识:

模块化的vuex的mutations和actions为了方便,可使用的mapMutations,mapActions,但最基础的用法还是要知道的:

this.$store.dispatch('命名空间/actions里的函数名',参数数据),

this.$store.commit('命名空间/mutations里的函数名',参数数据)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值