alive的不生效 keep vue_Vue中keep-alive的深入理解和使用

什么是keep-alive?

在平常开发中,有部分组件没有必要多次初始化,这时,我们需要将组件进行持久化,使组件的状态维持不变,在下一次展示时,也不会进行重新初始化组件。

也就是说,kee-alive 是 Vue 内置的一个组件,可以使被包含的组件保留状态,或避免重新渲染 。也就是所谓的组件缓存

基本用法

//被keep-alive包含的组件会被缓存

复制代码

被keep-alive包含的组件不会被再次初始化,也就意味着不会重走生命周期函数

但是有时候是希望我们缓存的组件可以能够再次进行渲染,这时Vue为我们解决了这个问题

被包含在 keep-alive 中创建的组件,会多出两个生命周期的钩子: activated 与 deactivated:

activated 当 keep-alive 包含的组件再次渲染的时候触发

deactivated 当 keep-alive 包含的组件销毁的时候触发

keep-alive是一个抽象的组件,缓存的组件不会被mounted,为此提供activated和deactivated钩子函数

在2.1.0 版本后keep-alive新加入了两个属性: include(包含的组件缓存生效) 与 exclude(排除的组件不缓存,优先级大于include) 。

参数理解

keep-alive可以接收3个属性做为参数进行匹配对应的组件进行缓存:

include包含的组件(可以为字符串,数组,以及正则表达式,只有匹配的组件会被缓存)

exclude排除的组件(以为字符串,数组,以及正则表达式,任何匹配的组件都不会被缓存)

max缓存组件的最大值(类型为字符或者数字,可以控制缓存组件的个数)

注:当使用正则表达式或者数组时,一定要使用v-bind

代码示例:

// 只缓存组件name为a或者b的组件

// 组件name为c的组件不缓存(可以保留它的状态或避免重新渲染)

// 如果同时使用include,exclude,那么exclude优先于include, 下面的例子只缓存a组件

// 如果缓存的组件超过了max设定的值5,那么将删除第一个缓存的组件

复制代码

配合router使用

router-view也是一个组件,如果直接被包在keepalive里面,那么所有路径匹配到的视图组件都会被缓存,如下:

复制代码

如果只想要router-view里面的某个组件被缓存,怎么办?

使用 include/exclude

使用 meta 属性

1.使用 include (exclude例子类似)

//只有路径匹配到的 name 为 a 组件会被缓存

复制代码

2.使用 meta 属性

// routes 配置

export default [

{

path: '/',

name: 'home',

component: Home,

meta: {

keepAlive: true // 需要被缓存

}

}, {

path: '/profile',

name: 'profile',

component: Profile,

meta: {

keepAlive: false // 不需要被缓存

}

}

]

复制代码

复制代码

防坑指南

1.keep-alive 先匹配被包含组件的 name 字段,如果 name 不可用,则匹配当前组件 components 配置中的注册名称。

2.keep-alive 不会在函数式组件中正常工作,因为它们没有缓存实例。

3.当匹配条件同时在 include 与 exclude 存在时,以 exclude 优先级最高(当前vue 2.4.2 version)。比如:包含于排除同时匹配到了组件A,那组件A不会被缓存。

4.包含在 keep-alive 中,但符合 exclude ,不会调用activated和 deactivated。

^_<

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值