首页
学习
活动
专区
圈层
工具
发布

动态组件切换“卡顿”终结者:Vue KeepAlive 全场景实战

「小墨是前端」致力于分享实用前端技术、挖掘优秀的开源项目,带你探索前端的奇妙世界,共同学习进步。

在 Vue 应用开发中,动态组件是构建灵活界面的利器。通过is特性,我们可以轻松切换不同组件。但是频繁的组件切换,可能导致应用出现“卡顿”,甚至状态丢失。比如:一个用户在电商网站上筛选商品,每次切换筛选条件,页面都要重新加载,之前的选择都没了,这体验简直是灾难!

罪魁祸首,是组件的销毁和重建。每次切换,Vue 都会销毁旧组件,创建新组件。这个过程,不仅消耗性能,还会丢失组件内部的状态(比如表单输入、滚动位置等)。

如何解决这个问题?Vue 提供了一个内置组件:。它可以将“暂时不用”的组件缓存起来,保留状态,避免重复渲染。下次再用到这个组件时,直接从缓存中“复活”,无需重新创建,从而大幅提升性能和用户体验。

快速上手:让你的动态组件“丝滑”切换

KeepAlive的用法非常简单,只需将你的动态组件包裹起来:

在这个例子中,CompA和CompB组件在切换时,并不会被销毁。当你来回切换时,会发现每个组件的状态(输入框的内容、计数器的值)都被完美保留。

精准控制:include、exclude 和 max

KeepAlive提供了三个 props,让我们可以更精细地控制缓存行为:

include: 只有名称匹配的组件才会被缓存。

exclude: 名称匹配的组件不会被缓存。

max: 最大缓存实例数。

这三个 props 的值,都可以是:

• 字符串(单个组件名)

• 以逗号分隔的字符串(多个组件名)

• 正则表达式

• 数组(包含字符串和正则表达式)

上面的例子,只有CompA和CompC会被缓存,并且最多缓存 5 个组件实例。多余的组件会按照LRU算法进行淘汰。

“唤醒”与“休眠”:onActivated 和 onDeactivated

被KeepAlive包裹的组件,会拥有两个特殊的生命周期钩子:

onActivated: 组件被激活时调用(首次挂载,或从缓存中恢复)。

onDeactivated: 组件进入缓存时调用。

利用这两个钩子,我们可以更灵活地控制组件的行为。比如,在onActivated中获取数据,在onDeactivated中保存状态,或者取消网络请求。

深入剖析:KeepAlive 的工作原理

KeepAlive的核心,是利用缓存技术,避免组件的重复创建和销毁。它做了以下几件事:

1. 抽象组件

KeepAlive是一个抽象组件,自身不渲染任何 DOM 元素,只负责管理子组件的缓存。

2. 缓存容器

KeepAlive内部维护了一个Map对象,用于存储缓存的组件实例。Map的键是组件的唯一标识(通常是name选项或keyprop),值是组件的虚拟节点(vnode)。此外,还有一个Set对象用于记录key的顺序, 用于LRU算法

3. 缓存策略

首次渲染:当KeepAlive首次渲染一个组件时,会正常创建组件实例,并将其虚拟节点缓存到Map中。

组件切换:当切换到已缓存的组件时,KeepAlive不会重新创建组件实例,而是直接从Map中取出缓存的虚拟节点,并更新其状态(比如el、component等)。同时通过move方法把这个虚拟节点对应的真实元素移动到页面内

缓存淘汰:如果缓存的组件数量超过了max限制,KeepAlive会使用 LRU(Least Recently Used,最近最少使用)算法,淘汰最久未被访问的组件。

4. 生命周期管理

• 当一个组件被缓存时,它的deactivated函数将会被执行,它的unmount函数并不会执行

• 当一个被缓存的组件被激活时,它的activated将会被执行, Vue 内部通过执行组件实例上的activate函数来激活组件,这个函数会更新组件的 DOM,并触发onActivated钩子。

• 如果组件是通过LRU被淘汰或者因为父组件销毁而被销毁, 那么首先执行的是unmount函数, 这个时候并不会执行deactivated

性能优化案例:无限滚动列表

假设我们要实现一个无限滚动的新闻列表。每次滚动到底部,都会加载更多新闻。如果每次都重新渲染所有新闻条目,性能会非常差。

利用KeepAlive,我们可以缓存已经加载的新闻组件,避免重复渲染:

在这个例子中,NewsItem组件会被KeepAlive缓存。即使滚动到列表底部,加载了更多新闻,之前的新闻组件也不会被销毁,从而大大提高了渲染性能。

最佳实践和注意事项

合理使用include和exclude:只缓存需要缓存的组件,避免不必要的内存占用。

设置合适的max值:根据应用场景,设置一个合理的最大缓存数。

利用onActivated和onDeactivated:在合适的时机执行初始化和清理操作。

KeepAlive不能保证组件永远存在:还是要处理组件正常unmount的逻辑

注意异步组件:KeepAlive对异步组件也有效。

总结

KeepAlive是 Vue 中一个强大的性能优化工具。通过缓存组件,它可以大幅减少不必要的渲染,提升应用性能和用户体验。理解它的原理和用法,可以让我们的 Vue 应用更加流畅、高效。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OPSGp4LNtYbmCQsyEGSA4m5A0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。
领券