keep-alive使用与销毁
在项目里经常会遇到以下情况,填单页跳转到选择信息页(eg:选择地址、选择证件),再返回到填单页时,填单页信息不变。可以使用Vue的内置的keep-alive缓存组件来实现以上功能。
1. 使用
在App.vue中加入keep-alive
<template>
<div id="app">
<keep-alive>
<router-view v-if="$route.meta.keepAlive" />
</keep-alive>
<router-view v-if="!$route.meta.keepAlive" />
<TabBar />
</div>
</template>
在路由文件中,给需要缓存的页面加上meta
{
path: '/fillorder/:code',
name: 'fillorder',
component: Fillorder,
meta: {
keepAlive: true,
},
},
2. 销毁
以上操作已经可以实现填单页的缓存,但是页面加载一次后变不会再重新请求数据,这并不能满足我们的需求。我们希望填单页返回到上一页再进入填单页时页面会重新加载。
所以,我们首先尝试在组件内的路由守卫,通过页面的去向改变该页面的keepAlive
beforeRouteLeave(to, from, next) {
if (to.name === 'selectAddr') {
from.meta.keepAlive = true;
} else {
from.meta.keepAlive = false;
}
next();
},
然后,再次进入页面可以重新加载。但是由于页面进入时是 keepAlive: false
,所以会导致出现两个<FillOrder>
组件。但问题来了,此时跳转选择地址页面再回到填单页时,显示的填单页是上一次的缓存,这样就导致显示不正确了。
keep-alive并未提供销毁包含组件的方法,但我们可以通过比较hack的方式去实现。
function removeKeepAliveCache () {
if (this.$vnode && this.$vnode.data.keepAlive && this.$vnode.parent) {
const tag = this.$vnode.tag;
let caches = this.$vnode.parent.componentInstance.cache;
let keys = this.$vnode.parent.componentInstance.keys;
for (let [key, cache] of Object.entries(caches)) {
if (cache.tag === tag) {
if (keys.length > 0 && keys.includes(key)) {
keys.splice(keys.indexOf(key), 1);
}
delete caches[key];
}
}
}
this.$destroy();
};
然后,在组件里的路由守卫调用removeKeepAliveCache
,同时也不需要去修改from.meta.keepAlive
了
beforeRouteLeave(to, from, next) {
if (to.name === 'selectAddr') {
// from.meta.keepAlive = true;
} else {
// from.meta.keepAlive = false;
removeKeepAliveCache.call(this);
}
next();
},
至此,就实现了我们开头所说的需求,填单页跳转到选择地址页,再返回到填单页时,填单页信息不变。再次重新进入填单页时,页面会刷新。
4 声望
1 粉丝
推荐阅读
[笔记]css揭秘
第一章 引言DRY (don't repeat yourself)代码易维护和代码量少不可兼得 {代码...} currentColor {代码...} 继承inherit 可以用在任何 CSS 属性中,而且它总是绑定到父元素的计算值(对伪元素来说,则会取生成该伪...
蓝胖子呢阅读 858
涨姿势了,有意思的气泡 Loading 效果
今日,群友提问,如何实现这么一个 Loading 效果:这个确实有点意思,但是这是 CSS 能够完成的?没错,这个效果中的核心气泡效果,其实借助 CSS 中的滤镜,能够比较轻松的实现,就是所需的元素可能多点。参考我们...
chokcoco赞 20阅读 2.1k评论 2
在前端使用 JS 进行分类汇总
最近遇到一些同学在问 JS 中进行数据统计的问题。虽然数据统计一般会在数据库中进行,但是后端遇到需要使用程序来进行统计的情况也非常多。.NET 就为了对内存数据和数据库数据进行统一地数据处理,发明了 LINQ (L...
边城赞 17阅读 1.9k
【已结束】SegmentFault 思否写作挑战赛!
SegmentFault 思否写作挑战赛 是思否社区新上线的系列社区活动在 2 月 8 日 正式面向社区所有用户开启;挑战赛中包含多个可供作者选择的热门技术方向,根据挑战难度分为多个等级,快来参与挑战,向更好的自己前进!
SegmentFault思否赞 20阅读 5.6k评论 10
你可能不需要JS!CSS实现一个计时器
CSS现在可不仅仅只是改一个颜色这么简单,还可以做很多交互,比如做一个功能齐全的计时器?样式上并不复杂,主要是几个交互的地方数字时钟的变化开始、暂停操作重置操作如何仅使用 CSS 来实现这样的功能呢?一起...
XboxYan赞 21阅读 1.6k评论 1
Vue2 导出excel
2020-07-15更新 excel导出安装 {代码...} src文件夹下新建一个libs文件夹,新建一个excel.js {代码...} vue页面中使用 {代码...} ===========================以下为早期的文章今天在开发的过程中需要做一个Vue的...
原谅我一生不羁放歌搞文艺赞 14阅读 19.9k评论 9
「彻底弄懂」this全面解析
当一个函数被调用时,会创建一个活动记录(有时候也称为执行上下文)。这个记录会包含函数在 哪里被调用(调用栈)、函数的调用方法、传入的参数等信息。this就是记录的其中一个属性,会在 函数执行的过程中用到...
wuwhs赞 17阅读 2.4k
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。