视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Vue内置组件:keep-alive组件的介绍与使用(附代码)
2020-11-27 19:32:19 责编:小采
文档

本篇文章给大家带来的内容是关于Vue内置组件:keep-alive组件的介绍与使用(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

keep-alive 简介

keep-alive是 Vue 内置的一个组件,可以使被包含的组件保留状态,或避免重新渲染。
在vue 2.1.0 版本之后,keep-alive新加入了两个属性: include(包含的组件缓存) 与 exclude(排除的组件不缓存,优先级大于include) 。

使用方法

<keep-alive include='include_components' exclude='exclude_components'>
 <component>
 <!-- 该组件是否缓存取决于include和exclude属性 -->
 </component>
</keep-alive>

参数解释
include - 字符串或正则表达式,只有名称匹配的组件会被缓存
exclude - 字符串或正则表达式,任何名称匹配的组件都不会被缓存
include 和 exclude 属性允许组件有条件地缓存。二者都可以用逗号分隔字符串、正则表达式或一个数组来表示。当使用正则或者是数组时,一定要使用v-bind !

使用示例

<!-- 逗号分隔字符串,只有组件a与b被缓存。 -->
<keep-alive include="a,b">
 <component></component>
</keep-alive>

<!-- 正则表达式 (需要使用 v-bind,符合匹配规则的都会被缓存) -->
<keep-alive :include="/a|b/">
 <component></component>
</keep-alive>

<!-- Array (需要使用 v-bind,被包含的都会被缓存) -->
<keep-alive :include="['a', 'b']">
 <component></component>
</keep-alive>

使用场景

1、尽管可以通过正则表达式来include和exclude一些组件,但用的更多是通过router.meta属性明确的指定该组件是否要缓存

router.meta配置

...
 {
 path: 'edit',
 component: () => import('@/views/site/edit'),
 name: 'site.edit',
 meta: {
 title: '网址编辑',
 hidden: true,
 cache: false
 }
 },
 {
 path: 'list',
 component: () => import('@/views/site/list'),
 name: 'site.list',
 meta: {
 title: '网址列表',
 hidden: false,
 cache: true
 }
 },
...

然后通过v-if标签来判断是否需要缓存

<!-- 缓存 -->
<keep-alive>
 <router-view v-if="$route.meta.cache"></router-view>
</keep-alive>

<!-- 不缓存 -->
<router-view v-if="!$route.meta.cache"></router-view>

2、不同的页面切换,刷新规则不同:B->A不刷新, C-A刷新

路由A的配置

{
 path: '/',
 name: 'A',
 component: A,
 meta: {
 cache: true // 需要被缓存
 }
}

组件B配置

export default {
 data() {
 return {};
 },
 methods: {},
 beforeRouteLeave(to, from, next) {
 // 设置下一个路由的 meta
 to.meta.cache = true; // 让 A 缓存,即不刷新
 next();
 }
};

组件C配置

export default {
 data() {
 return {};
 },
 methods: {},
 beforeRouteLeave(to, from, next) {
 // 设置下一个路由的 meta
 to.meta.cache = false; // 让 A 不缓存,即刷新
 next();
 }
};

注意事项

如果组件被缓存,created()方法是不会被执行的。而一般我们都会在created方法中去请求数据,加载列表,那么如果当前页面缓存了,后台数据有更新,就会造成数据不能及时显示到前台,这时就需要手动刷新页面了。
所以组件是否需要缓存需要事情而定

export default {
 data() {
 return {};
 },

 created() {
 // do some thing...
 },
 methods: {},
};

下载本文
显示全文
专题