Vue.js进阶系列(38)--keep-alive

  这个东西呢,不太好表述。简单的说就是不让组件来来去去的被创建和被销毁。(# ̄~ ̄#)


image.png

1.产生原因

  我们还是拿以前的例子。假设张三在 home 页面中点击了“消息”子内容;当张三点击别的页面后再重新回到 home 页面,就会发现原本在home 中点击的“消息”页面又回到了“新闻”页面。不懂没关系,看下面的动图 o( ̄︶ ̄)o

无名氏.gif

  那张三想要保留走之前的样子,要怎么做呢(ˇˍˇ) 想~ 很简单,通过 keep-alive 就可以做到了。

2.基本原理

  首先小编得很负责人的告诉你,组件的创建和销毁是一个不断循环的过程,这点可以通过两个生命函数来验证 create 和 destroyed。不信你瞧╭(╯^╰)╮

//在 home.vue 页面添加两个生命函数
<script>
    // 声生命函数
    export default {
        name:'home',
        created(){
            // document.title="首页"
            console.log("home 被创建啦 ^_^")
        },
        destroyed(){
            console.log("home 被销毁了 o(╥﹏╥)o")
        }
    }
</script>
组件创建的循环过程.gif

  这也就是为什么张三离开首页之后,首页的子内容就由“消息”变成了“新闻”。每当张三离开的时候,将相当于重新创建了 home 页面,而 home 页面中默认的就是显示“新闻” 的内容。
  于是乎就有了下面的结论:只要组件不是新创建的,就能保持离开时的模样,而kepp-alive 就可以做到这一点。

3.使用步骤

其实 keep-alive 的使用很简单。只需要将 router-view 紧紧的抱在怀里就好了 (✿◡‿◡)

    <!-- index.js 页面 -->
<template>
    <div>   
        <button @click="HomeClick">首页</button>
        <button @click="AboutClick">关于</button>
        <button @click="UserClick">用户</button>
        <button @click="ProfileClick">档案</button>       
        <keep-alive>
            <router-view></router-view>
        </keep-alive>
    </div>  
</template>
keep-alive.gif

看到图,小编有两个消息要告诉你们。一个好消息,一个坏消息。
好消息就是:使用了keep-alive后,组件从始至终只创建了一次,而且没有被销毁。
坏消息就是:当张三第二次进去 home 页面时,home 页面显示的依旧是“新闻”的内容 o(╥﹏╥)o
待小编调试完bug 后再来续更...


image.png

4.activated / deactivated 生命函数

① 定义

  这两个函数是为了解决上面的bug。activated,译为“活跃”的,也就是当组件处于活跃状态时将会回调的生命函数。相反,deactivated就是组件处于不活跃的状态。

② 使用场景

  但是这两个生命函数并不是所有的场景都使用的。只有使用了 keep-alive 时才可以使用。

③ 应用场景

  这里主要用 activated 函数解决上面的bug,此外我们还需要另外一个工具:beforeRouteLeave。beforeRouteLeave 是导航守卫之一,意思就是在监听离开路由时的事情。
因此,对付上面那种胡搅蛮缠的bug,解决思路如下:
第一:删除嵌套路由
  bug 的产生是因为一开始在 home 的地址中就有嵌套的路由,即 URL 的地址不仅仅是 /home 而是/home/news 或者 /home/message 。所以我们要先对嵌套的路由进行处理。打开 index.js 在路由映射关系中有关嵌套路由的代码 children 内部删除注释掉的代码:

{
    path:'/h ome',
    component:Home,
    meta:{
            title:'首页'
    },
    children:[
        // {
        //  path:"",
        //  redirect:"new"
    // },
        {
            path:"new",
            component:HomeNews,
    },
         {
            path:"message",
            component:HomeMessage,
    }   
    ]
},

第二:获取相关路径
  既然我们不能在嵌套路由中使用类似“/home/new” 的路径,我们就先定义一个变量path 来存放在嵌套路由中的路径“/home/new”;
  然后使用 activated 生命函数,当 home 页面被激活的时候获取当前激活状态下的路径;
  最后使用 beforeRouteLeave 导航守卫,记录用户离开页面时的路径,并将该路径赋值给变量path,这样当用户再次进入到该页面时,就会使用离开后的路径。具体代码如下所示:

<script>
// home.vue 文件
    export default {
        name:'home',
        data (){
            return {
                    path:'/home/new'
            }
        },
        created(){
            document.title="首页"
            console.log("home 被创建啦 ^_^")
        },
        destroyed(){
            console.log("home 被销毁了 o(╥﹏╥)o")
        },
        activated() {
            this.$router.push(this.path)
        },
        beforeRouteLeave(to,from,next){
            this.path = this.$route.path;
            next();
        }
        
    }
</script>

然后就是万众瞩目的一刻(¯﹃¯)


keep-alive完美版.gif

成功!o( ̄▽ ̄)d

好啦,今天的小编也要下线啦,要养足精神上网课╮(╯▽╰)╭ 针对今天的文章做出如下的总结:

1.keepl-alive

  当用户离开某个组件的时候,不要让该组件频繁的被创建和频繁的被销毁

2.activeted 和 dectivated

  译为“活跃的/不活跃的”这两个生命函数只有在使用了keep-alive 才可以使用


image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,816评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,729评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,300评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,780评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,890评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,084评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,151评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,912评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,355评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,666评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,809评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,504评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,150评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,121评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,628评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,724评论 2 351

推荐阅读更多精彩内容