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>组件。但问题来了,此时跳转选择地址页面再回到填单页时,显示的填单页是上一次的缓存,这样就导致显示不正确了。

WX20200617-154941@2x.png

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 粉丝
0 条评论
推荐阅读
[笔记]css揭秘
第一章 引言DRY (don't repeat yourself)代码易维护和代码量少不可兼得 {代码...} currentColor {代码...} 继承inherit 可以用在任何 CSS 属性中,而且它总是绑定到父元素的计算值(对伪元素来说,则会取生成该伪...

蓝胖子呢阅读 858

涨姿势了,有意思的气泡 Loading 效果
今日,群友提问,如何实现这么一个 Loading 效果:这个确实有点意思,但是这是 CSS 能够完成的?没错,这个效果中的核心气泡效果,其实借助 CSS 中的滤镜,能够比较轻松的实现,就是所需的元素可能多点。参考我们...

chokcoco20阅读 2.1k评论 2

在前端使用 JS 进行分类汇总
最近遇到一些同学在问 JS 中进行数据统计的问题。虽然数据统计一般会在数据库中进行,但是后端遇到需要使用程序来进行统计的情况也非常多。.NET 就为了对内存数据和数据库数据进行统一地数据处理,发明了 LINQ (L...

边城17阅读 1.9k

封面图
【已结束】SegmentFault 思否写作挑战赛!
SegmentFault 思否写作挑战赛 是思否社区新上线的系列社区活动在 2 月 8 日 正式面向社区所有用户开启;挑战赛中包含多个可供作者选择的热门技术方向,根据挑战难度分为多个等级,快来参与挑战,向更好的自己前进!

SegmentFault思否20阅读 5.6k评论 10

封面图
你可能不需要JS!CSS实现一个计时器
CSS现在可不仅仅只是改一个颜色这么简单,还可以做很多交互,比如做一个功能齐全的计时器?样式上并不复杂,主要是几个交互的地方数字时钟的变化开始、暂停操作重置操作如何仅使用 CSS 来实现这样的功能呢?一起...

XboxYan21阅读 1.6k评论 1

封面图
Vue2 导出excel
2020-07-15更新 excel导出安装 {代码...} src文件夹下新建一个libs文件夹,新建一个excel.js {代码...} vue页面中使用 {代码...} ===========================以下为早期的文章今天在开发的过程中需要做一个Vue的...

原谅我一生不羁放歌搞文艺14阅读 19.9k评论 9

「彻底弄懂」this全面解析
当一个函数被调用时,会创建一个活动记录(有时候也称为执行上下文)。这个记录会包含函数在 哪里被调用(调用栈)、函数的调用方法、传入的参数等信息。this就是记录的其中一个属性,会在 函数执行的过程中用到...

wuwhs17阅读 2.4k

封面图
4 声望
1 粉丝
宣传栏