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 相关文章推荐
xml 与javascript结合的问题解决方法
Mar 24 Javascript
jQuery中:checkbox选择器用法实例
Jan 03 Javascript
深入理解JavaScript系列(38):设计模式之职责链模式详解
Mar 04 Javascript
javascript+canvas实现刮刮卡抽奖效果
Jul 29 Javascript
javascript中利用柯里化函数实现bind方法
Apr 29 Javascript
JS实现动态增加和删除li标签行的实例代码
Oct 16 Javascript
鼠标拖动改变DIV等网页元素的大小的实现方法
Jul 06 Javascript
以BootStrap Tab为例写一个前端组件
Jul 25 Javascript
jQuery dateRangePicker插件使用方法详解
Jul 28 jQuery
JavaScript屏蔽Backspace键的实现代码
Nov 02 Javascript
基于Vue实现图片在指定区域内移动的思路详解
Nov 11 Javascript
利用d3.js力导布局绘制资源拓扑图实例教程
Jan 08 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
DSP接收机前端设想
2021/03/02 无线电
解析smarty模板中类似for的功能实现
2013/06/18 PHP
PHP中source #N问题的解决方法
2014/01/27 PHP
zen cart实现订单中增加paypal中预留电话的方法
2016/07/12 PHP
php的socket编程详解
2016/11/20 PHP
laravel利用中间件做防非法登录和权限控制示例
2019/10/21 PHP
JavaScript ( (__ = !$ + $)[+$] + ({} + $)[_/_] +({} + $)[_/_] )
2011/02/25 Javascript
Eclipse去除js(JavaScript)验证错误
2014/02/11 Javascript
JS根据生日算年龄的方法
2015/05/05 Javascript
JavaScript实现将数组数据添加到Select下拉框的方法
2015/08/21 Javascript
javascript 判断两个日期之差的示例代码
2015/09/05 Javascript
js获取时间精确到秒(年月日)
2016/03/16 Javascript
Bootstrap每天必学之警告框插件
2016/04/26 Javascript
ES6(ECMAScript 6)新特性之模板字符串用法分析
2017/04/01 Javascript
Three.js的使用及绘制基础3D图形详解
2017/04/27 Javascript
想用好React的你必须要知道的一些事情
2017/07/24 Javascript
使用AngularJS编写多选按钮选中时触发指定方法的指令代码详解
2017/07/24 Javascript
浅谈Node.js之异步流控制
2017/10/25 Javascript
微信小程序自定义navigationBar顶部导航栏适配所有机型(附完整案例)
2020/04/26 Javascript
wxpython 最小化到托盘与欢迎图片的实现方法
2014/06/09 Python
PyQt5实现拖放功能
2018/04/25 Python
Pycharm打开已有项目配置python环境的方法
2020/07/03 Python
详解使用Python写一个向数据库填充数据的小工具(推荐)
2020/09/11 Python
python Gabor滤波器讲解
2020/10/26 Python
开发人员所需要知道的HTML5性能分析面面观
2012/07/05 HTML / CSS
编写html5时调试发现脚本php等网页js、css等失效
2013/12/31 HTML / CSS
html5实现九宫格抽奖可固定抽中某项奖品
2020/06/15 HTML / CSS
万宝龙英国官网:Montblanc手表、书写工具、皮革和珠宝
2018/10/16 全球购物
夏季奶茶店创业计划书
2014/01/16 职场文书
解除聘用合同证明书范本
2014/09/11 职场文书
租房协议书
2014/09/12 职场文书
领导班子群众路线与四风问题对照检查材料思想汇报
2014/10/11 职场文书
夫妻分居协议书范本
2014/11/28 职场文书
颐和园英文导游词
2015/01/30 职场文书
SpringBoot生成License的实现示例
2021/06/16 Java/Android
Win11怎么进入安全模式?Windows 11进入安全模式的方法
2021/11/21 数码科技