需求说明:

本文章主要是解决第三个需求。

代码如下:

(代码说明:store.state.pages是我存储标签页的列表,记录了当前打开的标签页的路由数据)

旧的方法:

//使用Vue.mixin的方法拦截了路由离开事件,并在该拦截方法中实现了销毁页面缓存的功能。

let cachePageDataList =[]

Vue.mixin({

beforeRouteLeave:function(to, from, next) {

const pages= this.$store.getters.pages.map(item =>{returnitem.name

})

const expect= ['login']if (from && expect.indexOf(from.name) < 0 && pages.indexOf(from.name) < 0) { //此处判断该路由对应的标签页是否已关闭,以此判断是否摧毁本层缓存。

const $vnode = this.$vnodeif (($vnode && $vnode.data.keepAlive) &&($vnode.parent&& $vnode.parent.componentInstance && $vnode.parent.componentInstance.cache) &&($vnode.componentOptions)

) {var key = $vnode.key == null ? $vnode.componentOptions.Ctor.cid + ($vnode.componentOptions.tag ? `::${$vnode.componentOptions.tag}` : '') : $vnode.keyvar cache =$vnode.parent.componentInstance.cachevar keys =$vnode.parent.componentInstance.keysif(cache[key]) {if (keys.length && keys.indexOf(key) > -1) {

keys.splice(keys.indexOf(key),1)

}deletecache[key]

}

}//this.$destroy()

}

next()

},

watch: {'$store.getters.pages': function(v) {

const temp=[...cachePageDataList]

const c= v.map(item =>{returnitem.name

})if (c.join(',') !== temp.join(',')) {

cachePageDataList=[...c]//判断是否有页面被删除了

temp.forEach(item =>{if (c.indexOf(item) < 0) { //这个标签页被关闭了

console.log('%c 222222222222222222222', 'color:red;font-size:20px')

console.log(item+ '被关闭了,当前路由是:' + this.$route.name)

const current= this.$routeif (item !==current) {this.$router.push({ name: item }) //跳转一下这个被删除的标签页,然后再调回当前页,以此来触发beforeLeave事件

this.$router.push(current)

}

}

})

}

}

}

})

旧方法的思路步骤是:

1、每次监听到路由离开事件时,判断是否需要清除该页面的缓存,如果是,则清除;

2、监听【标签页】的变化,如果有标签页被关闭了,就打开该页面路由、再关闭,从而手动触发路由离开事件

旧方法的核心是拦截路由离开事件,但是这种方法有缺陷是:

缺陷1、步骤2时会导致额外的路由跳转,如果该路由下的页面比较复杂,会导致额外的性能消耗;

缺陷2:当同时关闭多个页面缓存时,可能导致长时间的卡顿;

由此作出一些改进。。。

------------ 分割线 -------------

新的方式:

//使用Vue.mixin的方法存储页面缓存,并且当标签页关闭时,清除页面缓存

let cachePageDataList =[]

let cacheList, keysList

const nameKeyList={}

Vue.mixin({

beforeRouteEnter (to, from, next) {

next(vm=>{//console.log('%c 进入页面' + to.name, 'color:red;font-size:20px')

const $vnode =vm.$vnodeif (($vnode && $vnode.data.keepAlive) &&($vnode.parent&& $vnode.parent.componentInstance && $vnode.parent.componentInstance.cache) &&($vnode.key||$vnode.componentOptions)

) {var key = $vnode.key == null ? $vnode.componentOptions.Ctor.cid + ($vnode.componentOptions.tag ? `::${$vnode.componentOptions.tag}` : '') : $vnode.keyvar cache =$vnode.parent.componentInstance.cachevar keys =$vnode.parent.componentInstance.keysif (!cacheList) cacheList =cacheif (!keysList) keysList =keys

nameKeyList[to.name]=key//console.log(cacheList, keysList, nameKeyList)

}

})

},

watch: {'$store.getters.pages': function(v) {

const temp=[...cachePageDataList]

const newpages= v.map(item =>{returnitem.name

})if (newpages.join(',') !== temp.join(',')) {

cachePageDataList=[...newpages]//判断是否有页面被删除了

temp.forEach(item =>{if (newpages.indexOf(item) < 0) { //监听到这个标签页被关闭了

//console.log('%c 这个标签页被关闭了:' + item, 'color:red;font-size:20px')

//console.log(item + '被关闭了,当前路由是:' + this.$route.name)

//删除缓存的核心方法 start

const key =nameKeyList[item]if (key &&cacheList[key]) {if (keysList.length && keysList.indexOf(key) > -1) {

keysList.splice(keysList.indexOf(key),1)

}deletecacheList[key]

}//删除缓存的核心方法 end

}

})

}

}

}

})

新方式的思路步骤是:

1、首次任意路由时,把cacheList和keysList的指针保存起来,备用

2、每次进入路由时,将该页面的路由name和组件key保存起来,备用

3、监听到该路由页面标签关闭时,使用cacheList和keysList删除页面缓存

这里面的核心方法是如何删除页面缓存、怎么获取页面组件key?(见代码)

新方式的思路导图:

由此,可以解决卡顿的问题,提高性能。

vue 删除页面缓存_VUE清除keepalive页面缓存相关推荐

  1. vue中怎么清空tab选项卡的缓存_vue Tab切换以及缓存页面处理的几种方式

    前言 相信tab切换对于大家来说都不算陌生,后台管理系统中多会用到.如果不知道的话,可以看一下浏览器上方的标签页切换,大概效果就是这样. 1.如何切换 使用动态组件,相信大家都能看懂(部分代码省略) ...

  2. vue 回车查询 按钮_vue之在页面中监听键盘的Enter键来触发某个按钮事件

    项目中得需求:给页面某个按钮绑定Enter键,但是按钮不在form中,直接给按钮绑定后此按钮只有获取了焦点按键才会触发,显然,一直保持按钮获取焦点是不现实得.所以通过查询等,结合项目需求,完成了下面得 ...

  3. vue 停止页面滚动_Vue禁止h5页面iOS浏览器下拉bounce效果

    介绍 vue-disbounce是一款基于Vue.js的自定义组件,可以有效避免触发h5页面在ios浏览器内置的下拉bounce效果. 组件 :style="{'background-col ...

  4. java vue 服务端渲染_vue服务端渲染缓存应用详解

    服务端渲染简介 服务端渲染不是一个新的技术:在 Web 最初的时候,页面就是通过服务端渲染来返回的,用 PHP 来说,通常是使用 Smarty 等模板写模板文件,然后 PHP 服务端框架将数据和模板渲 ...

  5. ref获取元素 vue 删除子元素_vue中的 ref 和 $refs

    相信前端开发或者后端开发都用过jquery,因为不是数据驱动,为了获取某些元素的value值,都操作过Dom元素. // 使用Jquery获取Dom元素值$("#id").text ...

  6. 删除java证书_ssl – 清除Java证书缓存(强制重新加载证书)

    默认的Java密钥库位置是主目录下的.keystore文件(user.home系统属性),因此除非您另外指定Java应用程序的外观. 试试跑步: $keytool -list -keystore ~/ ...

  7. C#清除缓存、清除IE临时文件缓存cookies的方法

    如何清除IE缓存(Internet临时文件,Cookie,历史记录,表单记录,上网密码)?飘易建议大家可以调用系统API来实现,可以使用借助RunDll32.exe 来运行Internet选项的对应删 ...

  8. 【C#学习笔记】C#清除缓存、清除IE临时文件缓存cookies的方法

    如何清除IE缓存(Internet临时文件,Cookie,历史记录,表单记录,上网密码)?飘易建议大家可以调用系统API来实现,可以使用借助RunDll32.exe 来运行Internet选项的对应删 ...

  9. vue切换路由不重新渲染_Vue来回切换页面不重新加载 --keep-alive

    vue通过路由来回切换两个页面,默认会重新加载当前页面,导致页面不流畅&&加载时间过长等. 而是Vue的内置的一个组件,可以在组件切换过程中将状态保留在内存中,防止重复渲染DOM. 当 ...

  10. vue切换路由页面数据缓存_Vue-Router实现前端页面缓存

    一.使用情景 在使用Vue开发单页面应用时,我们通常会使用Vue-Router进行页面导航,Vue-Router在进行路由切换的时候,页面是会重新加载,对应的生命周期函数也会再次执行一遍,但是在有些业 ...

最新文章

  1. spring-amqp生产者手动ACK
  2. 从零点五开始用Unity做半个2D战棋小游戏(五)
  3. (139)FPGA面试题-FPGA设计中的速度和面积互换原则
  4. 库克也有手机瘾:每天拿起iPhone200次 比预想多一倍
  5. 关于鼠标移到gridview行上,背景变色的问题。
  6. Windows 系统下安装anaconda教程 ,小白教程!!!
  7. java xppreader_Java對象轉換XML文件:XStream+XPP | 學步園
  8. 免费漫画系统,漫城cms内容管理系统,免费原生app
  9. 最新版校园招聘进大厂系列----------(5)百度篇 -----未完待续
  10. java 文字水印 旋转_java实现倾斜水印铺满整张图
  11. 斐讯k3怎么设置虚拟服务器,斐讯 K3 无线路由器无线中继设置教程
  12. 聚类分析(cluster analysis)
  13. 【spider】关于scrapy的安装的几个问题
  14. 时间序列模型步骤教程(ARIMA)
  15. 腾讯云服务器支持,腾讯云服务器能拿来干嘛(可以做的事情很多)
  16. 未启用远程计算机的访问,技术员解决win10系统连接远程提示未启用对服务器的远程访问的技巧...
  17. 云栖专辑 | 阿里开发者们的20个感悟,一通百通 1
  18. Win7 中IIS配置
  19. Apple Watch开发
  20. windows 安装包管理器scoop

热门文章

  1. 使用c语言打印九九乘法表
  2. 凯立德导航 版本号意义解读
  3. 直播上市潮 未上市平台未来不可期?
  4. java材质转基岩版_我的世界java版材质包转换导入基岩版教程
  5. pythonpdf识别文字软件_如何使用Python进行PDF图片识别OCR
  6. 吉林大学学生邮箱接收服务器地址
  7. C4D景深与运动模糊及hdr预设文件添加技巧
  8. java计算机毕业设计校园环境保护监督系统源代码+系统+数据库+lw文档
  9. LeetCode-回文数C语言实现
  10. 图像处理——插值算法