vue中keep-alive的使用及详解

概念

keep-alive是vue内置抽象组件,他自身不会渲染成一个DOM组件,也不会出现父组件链中。使用keep-alive包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。

作用

在组件切换过程中将状态保留在内存中,防止重复渲染DOM,减少加载时间及性能消耗,提高用户体验性。

原理

在created 函数调用时将需要缓存的VNode节点保存在this.cache中/在render(页面渲染)时,如果VNode的name符合缓存条件(可以用include以及exclude控制),则会从this.cache中取出之前缓存的VNode实例进行渲染。

export default {
  props: {
    include: patternTypes, // 允许组件有条件地进行缓存
    exclude: patternTypes,
    max: [String, Number] // 最多可以缓存多少组件实例
  },
  created () {
    this.cache = Object.create(null) // 创建一个cache对象,用来作为缓存容器,保存vnode节点
    this.keys = []
  },
  destroyed () {
    // 清除cache缓存中的所有组件实例
    for (const key in this.cache) {
      pruneCacheEntry(this.cache, key, this.keys)
    }
  },
}
function pruneCacheEntry (
  cache: VNodeCache,
  key: string,
  keys: Array<string>,
  current?: VNode
) {
  const cached = cache[key]
  if (cached && (!current || cached.tag !== current.tag)) {
    cached.componentInstance.$destroy()
  }
  cache[key] = null
  remove(keys, key)
}

Props

  • include: 字符串或正则表达式,只有名称匹配的组件会被缓存。
  • exclude:字符串或正则表达式,任何名称匹配的组件都不会被缓存。
  • max: 数字,最多可以缓存多少组件实例。

生命周期函数

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

1、activated
在keep-alive 组件激活时调用
该钩子函数在服务器端渲染期间不被调用

2、deactivated
在keep-alive 组件停用时调用
该钩子函数在服务器端渲染期间不被调用

使用keep-alive 会将数据保存在内存中,如果每次进入页面的时候需要获取最新数据,需要在activated 阶段获取数据,承担原来created 钩子函数中获取的数据

只有组件被keep-alive 包裹时,这两个生命周期才会被调用,如果作为正常组件,是不会被调用的。在服务器端渲染时,此钩子也不会被调用。

缓存所有页面

在这里插入图片描述

结合router.js页面 缓存部分页面

1、父组件页面
在这里插入图片描述
2、router.js 页面
在这里插入图片描述

根据条件 缓存页面

1、父组件页面
在这里插入图片描述
2、router.js 页面
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值