vue中使用keepAlive(缓存页面及记忆上次浏览位置)

柔情痞子 提交于 2019-12-05 04:22:00

转自博客:https://www.cnblogs.com/nokelong/p/8116631.html

使用keepAlive缓存页面,一可以减少服务器请求次数,二则可以在用户返回上一页后记忆到上次浏览位置

keep-alive的介绍如下:

1,把切换出去的组件保留在内存中,可以保留它的状态或避免重新渲染。
2、<keep-alive>是抽象组件,它自身不会渲染DOM元素,也不会出现在父组件链中。
3、当组件在 <keep-alive> 内被切换,它的 activated 和 deactivated 这两个生命周期钩子函数将会被对应执行。
注:在 2.2.0 及其更高版本中,activated 和 deactivated 将会在 <keep-alive> 树内的所有嵌套组件中触发。

基本用法:使用keep-alive直接包裹组件

使用keep-alive直接包裹组件
<keep-alive>
    <component :is="view"></component>
</keep-alive> 

//注:<keep-alive> 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。


如果需要缓存整个项目,则如下设置(直接包裹根router-view即可):
<keep-alive>
    <router-view> </router-view>
</keep-alive>

缓存部分页面或者组件,使用route.meta属性

1、在App.vue中设置:(根据是否需要缓存切换模式)
<keep-alive>
    <router-view v-if="$route.meta.keepAlive"></router-view>
</keep-alive>
    <router-view v-if="!$route.meta.keepAlive"></router-view>

2、在router.js路由页设置:
{
    path: '/demo/demoIndex',
    name: 'DemoIndex',
    component: DemoIndex,
    meta: { 
        keepAlive: true,    //设置keepAlive为true,则App.vue里的$route.meta.keepAlive即为true
        title:'示例页面' 
    }
} 

使用新增属性include/exclude

vue2.1.0 新增了include,exclude俩个属性,允许组件有条件的缓存。二者都可以用逗号分隔字符串、正则表达式或一个数组来表示。
    <!-- 逗号分隔字符串 -->
    <keep-alive include="a,b">
        <component :is="view"></component>
    </keep-alive>
 
    <!-- 正则表达式 (使用 `v-bind`) -->
<keep-alive :include="/a|b/">
    <component :is="view"></component>
</keep-alive>
 
    <!-- 数组 (使用 `v-bind`) -->
<keep-alive :include="['a', 'b']">
    <component :is="view"></component>
</keep-alive>

注:匹配首先检查组件自身的 name 选项,如果 name 选项不可用,则匹配它的局部注册名称 (父组件 components 选项的键值)。匿名组件不能被匹配。

动态判断,使用v-bind:include

<keep-alive :include="includedComponents">
    <router-view></router-view>
</keep-alive>
includedComponents动态设置即可  

使用beforeRouteLeave或者afterEach中进行拦截处理

如在项目在Category组件中的设置:
beforeRouteLeave(to,from,next){
    if(to.name=='DemoIndex'){
        if(!from.meta.keepAlive){
            from.meta.keepAlive=true
        }
        next()
    }else{
        from.meta.keepAlive=false
        to.meta.keepAlive=false
        next()
    }
},
在beforeRouteLeave中to.name根据具体的路由进行动态缓存设置。 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!