vue中keep-alive,include的缓存问题


Posted in Javascript onNovember 26, 2019

前提:有A,B,C,D四个页面,A是按钮页(点击按钮进入B页面),B是订单列表页,C是订单详情页,D是费用详情页

需求:顺序是A->B->C->D,每次都刷新页面,D->C->B时走缓存,但是每次从A到B都要刷新B页面,从B到C需要刷新C页面,从C到D要刷新D页面

在vue官方文档2.1以上有include 和 exclude 属性允许组件有条件地缓存。在这里主要用include结合vuex来实现(四个页面组件都有自己的name才会生效,这里name就叫A,B,C,D)

从D->C,从C->B,从B->A 可以写一个公共的头部返回组件,统一使用 this.$router.go(-1)返回前一页

App.vue

<template>
 <div class="app">
  <keep-alive :include="keepAlive" >
   <router-view/>
  </keep-alive>
 </div>
</template>

<script type='text/javascript'>
export default {
 data () {
  return {}
 },
 computed: {
  keepAlive () {
   return this.$store.getters.keepAlive
  }
 }
}
</script>

store.js

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
 state: {
  keepAlive: []
 },
 mutations: {
  SET_KEEP_ALIVE: (state, keepAlive) => {
   state.keepAlive = keepAlive
  }
 },
 getters: {
  keepAlive: state => state.keepAlive
 }
})

每次进入B页面时先初始化 keepAlive(设置要走缓存的页面)

A.vue

<script>
  export default {
    name: 'A',
    methods: {
      buttonClick () {
        this.$store.commit('SET_KEEP_ALIVE', ['B', 'C', 'D']) 



  this.$router.push('/B') 



 } 


 } 

}
</script>

B.vue 该页面用来设置缓存和清除缓存

<script>
  export default {
    name: 'B',
    beforeRouteEnter (to, from, next) {
      next(vm => {
        if (from.path.indexOf('C') > -1) {
          vm.$store.commit('SET_KEEP_ALIVE', ['B'])
        }
      })
    },
    beforeRouteLeave (to, from, next) {
      if (to.path.indexOf('C') > -1) {
        this.$store.commit('SET_KEEP_ALIVE', ['B', 'C'])
      } else if (to.path.indexOf('A') > -1) {



 this.$store.commit('SET_KEEP_ALIVE', []) 
      }
      next()
    }
 }
</script>

到这里就实现了需求

PS:vue keep-alive include无效

检查版本

确定当前的vue版本的是2.1+

因为include和exclude是vue2.1.0新增的两个属性.

package.json

"vue": "^2.5.2",

检查name

注意,不是router.js中的name,而是单个vue组件中的name属性.

建议将router.js中的name和vue组件的name保持一致,不要混乱.

export default {
  name: "index"
}

多层嵌套

网上的答案几乎都是检查vue组件的name属性,但还是有一个巨坑.

那就是多级嵌套<router-view></router-view>,但凡有超过两个以上的router-view且是父子级关系,请都加上keep-alive,只加一个不会生效.

// app.vue
<keep-alive include="app,index">
  <router-view></router-view>
</keep-alive>

// other.vue
<keep-alive include="app,index">
  <router-view></router-view>
</keep-alive>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
解javascript 混淆加密收藏
Jan 16 Javascript
javascript textContent与innerText的异同分析
Oct 22 Javascript
jQuery学习笔记之控制页面实现代码
Feb 27 Javascript
jQuery $.get 的妙用 访问本地文本文件
Jul 12 Javascript
如何在JavaScript中实现私有属性的写类方式(二)
Dec 04 Javascript
限制文本框只能输入数字||只能是数字和小数点||只能是整数和浮点数
May 27 Javascript
vue-router:嵌套路由的使用方法
Feb 21 Javascript
微信小程序中的店铺评分组件及vue中用svg实现的评分显示组件
Nov 16 Javascript
微信小程序功能之全屏滚动效果的实现代码
Nov 22 Javascript
关于ligerui子页面关闭后,父页面刷新,重新加载的方法
Sep 27 Javascript
处理JavaScript值为undefined的7个小技巧
Jul 28 Javascript
nuxt.js添加环境变量,区分项目打包环境操作
Nov 06 Javascript
JS插件amCharts实现绘制柱形图默认显示数值功能示例
Nov 26 #Javascript
jQuery与原生JavaScript选择HTML元素集合用法对比分析
Nov 26 #jQuery
原生js实现贪食蛇小游戏的思路详解
Nov 26 #Javascript
高效jQuery选择器的5个技巧实例分析
Nov 26 #jQuery
JavaScript计算正方形面积
Nov 26 #Javascript
javaScript中indexOf用法技巧
Nov 26 #Javascript
浅谈Node新版本13.2.0正式支持ES Modules特性
Nov 25 #Javascript
You might like
用PHP实现的四则运算表达式计算实现代码
2011/08/02 PHP
JQuery中对服务器控件 DropdownList, RadioButtonList, CheckboxList的操作总结
2011/06/28 Javascript
这段js代码得节约你多少时间
2011/12/20 Javascript
左右悬浮可分组的网站QQ在线客服代码(可谓经典)
2012/12/21 Javascript
js使下拉列表框可编辑不止是选择
2013/12/12 Javascript
JS刷新当前页面的几种方法总结
2013/12/24 Javascript
jQuery中:disabled选择器用法实例
2015/01/04 Javascript
js实现的全国省市二级联动下拉选择菜单完整实例
2015/08/17 Javascript
基于JQuery实现仿网易邮箱全屏动感滚动插件fullPage
2015/09/20 Javascript
jQuery实现的个性化返回底部与返回顶部特效代码
2015/10/30 Javascript
Canvas 制作动态进度加载水球详解及实例代码
2016/12/09 Javascript
详解js数组的完全随机排列算法
2016/12/16 Javascript
JavaScript实现垂直滚动条效果
2017/01/18 Javascript
Three.js实现浏览器变动时进行自适应的方法
2017/09/26 Javascript
解决layui批量传值到后台操作时出现传值为空的问题
2019/09/28 Javascript
D3.js 实现带伸缩时间轴拓扑图的示例代码
2020/01/20 Javascript
node.js 使用 net 模块模拟 websocket 握手进行数据传递操作示例
2020/02/11 Javascript
[02:51]2018年度DOTA2最佳中单位选手-完美盛典
2018/12/17 DOTA
Python 执行字符串表达式函数(eval exec execfile)
2014/08/11 Python
在Python程序中进行文件读取和写入操作的教程
2015/04/28 Python
Python使用redis pool的一种单例实现方式
2016/04/16 Python
简单谈谈python中的多进程
2016/11/06 Python
django轻松使用富文本编辑器CKEditor的方法
2017/03/30 Python
Python实现对一个函数应用多个装饰器的方法示例
2018/02/09 Python
python实现录音小程序
2020/10/26 Python
python3实现弹弹球小游戏
2019/11/25 Python
Django之choices选项和富文本编辑器的使用详解
2020/04/01 Python
python如何建立全零数组
2020/07/19 Python
美国职棒大联盟官方网上商店:MLBShop.com
2017/11/12 全球购物
Homestay中文官网:全球寄宿家庭
2018/10/18 全球购物
JAVA和C++的区别
2013/10/06 面试题
社区文艺活动方案
2014/08/19 职场文书
2014年营销工作总结
2014/11/22 职场文书
学校2014年度工作总结
2014/12/06 职场文书
创业计划书之健康营养产业
2019/10/15 职场文书
mysql对于模糊查询like的一些汇总
2021/05/09 MySQL