vue 删除页面缓存_VUE清除keepalive页面缓存
需求说明:
本文章主要是解决第三个需求。
代码如下:
(代码说明: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页面缓存相关推荐
- vue中怎么清空tab选项卡的缓存_vue Tab切换以及缓存页面处理的几种方式
前言 相信tab切换对于大家来说都不算陌生,后台管理系统中多会用到.如果不知道的话,可以看一下浏览器上方的标签页切换,大概效果就是这样. 1.如何切换 使用动态组件,相信大家都能看懂(部分代码省略) ...
- vue 回车查询 按钮_vue之在页面中监听键盘的Enter键来触发某个按钮事件
项目中得需求:给页面某个按钮绑定Enter键,但是按钮不在form中,直接给按钮绑定后此按钮只有获取了焦点按键才会触发,显然,一直保持按钮获取焦点是不现实得.所以通过查询等,结合项目需求,完成了下面得 ...
- vue 停止页面滚动_Vue禁止h5页面iOS浏览器下拉bounce效果
介绍 vue-disbounce是一款基于Vue.js的自定义组件,可以有效避免触发h5页面在ios浏览器内置的下拉bounce效果. 组件 :style="{'background-col ...
- java vue 服务端渲染_vue服务端渲染缓存应用详解
服务端渲染简介 服务端渲染不是一个新的技术:在 Web 最初的时候,页面就是通过服务端渲染来返回的,用 PHP 来说,通常是使用 Smarty 等模板写模板文件,然后 PHP 服务端框架将数据和模板渲 ...
- ref获取元素 vue 删除子元素_vue中的 ref 和 $refs
相信前端开发或者后端开发都用过jquery,因为不是数据驱动,为了获取某些元素的value值,都操作过Dom元素. // 使用Jquery获取Dom元素值$("#id").text ...
- 删除java证书_ssl – 清除Java证书缓存(强制重新加载证书)
默认的Java密钥库位置是主目录下的.keystore文件(user.home系统属性),因此除非您另外指定Java应用程序的外观. 试试跑步: $keytool -list -keystore ~/ ...
- C#清除缓存、清除IE临时文件缓存cookies的方法
如何清除IE缓存(Internet临时文件,Cookie,历史记录,表单记录,上网密码)?飘易建议大家可以调用系统API来实现,可以使用借助RunDll32.exe 来运行Internet选项的对应删 ...
- 【C#学习笔记】C#清除缓存、清除IE临时文件缓存cookies的方法
如何清除IE缓存(Internet临时文件,Cookie,历史记录,表单记录,上网密码)?飘易建议大家可以调用系统API来实现,可以使用借助RunDll32.exe 来运行Internet选项的对应删 ...
- vue切换路由不重新渲染_Vue来回切换页面不重新加载 --keep-alive
vue通过路由来回切换两个页面,默认会重新加载当前页面,导致页面不流畅&&加载时间过长等. 而是Vue的内置的一个组件,可以在组件切换过程中将状态保留在内存中,防止重复渲染DOM. 当 ...
- vue切换路由页面数据缓存_Vue-Router实现前端页面缓存
一.使用情景 在使用Vue开发单页面应用时,我们通常会使用Vue-Router进行页面导航,Vue-Router在进行路由切换的时候,页面是会重新加载,对应的生命周期函数也会再次执行一遍,但是在有些业 ...
最新文章
- spring-amqp生产者手动ACK
- 从零点五开始用Unity做半个2D战棋小游戏(五)
- (139)FPGA面试题-FPGA设计中的速度和面积互换原则
- 库克也有手机瘾:每天拿起iPhone200次 比预想多一倍
- 关于鼠标移到gridview行上,背景变色的问题。
- Windows 系统下安装anaconda教程 ,小白教程!!!
- java xppreader_Java對象轉換XML文件:XStream+XPP | 學步園
- 免费漫画系统,漫城cms内容管理系统,免费原生app
- 最新版校园招聘进大厂系列----------(5)百度篇 -----未完待续
- java 文字水印 旋转_java实现倾斜水印铺满整张图
- 斐讯k3怎么设置虚拟服务器,斐讯 K3 无线路由器无线中继设置教程
- 聚类分析(cluster analysis)
- 【spider】关于scrapy的安装的几个问题
- 时间序列模型步骤教程(ARIMA)
- 腾讯云服务器支持,腾讯云服务器能拿来干嘛(可以做的事情很多)
- 未启用远程计算机的访问,技术员解决win10系统连接远程提示未启用对服务器的远程访问的技巧...
- 云栖专辑 | 阿里开发者们的20个感悟,一通百通 1
- Win7 中IIS配置
- Apple Watch开发
- windows 安装包管理器scoop