当前位置:

首页 > 编程开发 > vue3使用keep-alive组件,包含动态组件使用详解

vue3使用keep-alive组件,包含动态组件使用详解

Vue3中keep-alive用于缓存组件状态并避免重复渲染。动态组件需使用markRaw或shallowRef避免响应式警告。keep-alive内不能有注释,否则报错。路由缓存需在component上使用v-if实现按需缓存,被缓存组件会触发activated/deactivated生命周期钩子。

本文目录

    vue3使用keep-alive组件,包含动态组件使用详解

    在 Vue 3 项目中,keep-alive 几乎是缓存组件状态、避免重复渲染的标配方案。但很多开发者在实际使用中总会遇到一些奇怪的坑——比如动态组件缓存不生效、路由缓存莫名其妙地失效,或者报出“expects exactly one child component”这类让人摸不着头脑的错误。下面就从最基础的无缓存开始,一步步搭起完整的缓存体系,顺带把这些容易翻车的地方也一并点出来。

    组件不使用keep-alive

    先看一个最简单的例子:父组件通过 v-if/v-else 切换两个子组件,不添加任何缓存。

    • Father
    • Child
    • Child2

    vue3使用keep-alive组件,包含动态组件使用详解vue3使用keep-alive组件,包含动态组件使用详解

    每次点击按钮切换,对应的子组件都会被销毁并重新创建。如果子组件中有表单输入之类的状态,切换回来时数据就丢了。因此需要 keep-alive 来保持组件的“记忆”。

    组件中使用

    keep-alive 提供了两个常用的配置:

    • include:指定需要缓存的组件名(对应组件 name 选项)
    • exclude:排除掉不需要缓存的组件

    v-if切换

    先看直接包裹 v-if/v-else 的情况:

                        

    这样两个组件都会被缓存。如果只想缓存其中的一个,可以利用 include:

                        

    此时只有 Child2 会被缓存,Child 每次切换都会重新创建。

    vue3使用keep-alive组件,包含动态组件使用详解vue3使用keep-alive组件,包含动态组件使用详解vue3使用keep-alive组件,包含动态组件使用详解

    component动态组件切换

    因注释导致的意外错误

    使用动态组件 component :is 时,经常会遇到一个报错:

    expects exactly one child component

    vue3使用keep-alive组件,包含动态组件使用详解

    这个错误原因很简单——keep-alive 内部只能有一个直接子节点,而注释(HTML comment)会被当作一个虚拟节点,导致实际子节点变成了两个。比如下面这样就会报错:

                        

    解决方案有两种:要么用

    把注释和组件包起来(但这样缓存会作用于整个 div,失去部分效果),要么直接去掉注释:

                  

    动态组件的使用

    如果直接用 ref 或 reactive 来保存组件引用,Vue 会发出警告:

    [Vue warn]: Vue received a Component which was made a reactive object. This can lead to unnecessary performance overhead, and should be a voided by marking the component with 'markRaw' or using 'shallowRef' instead of 'ref'.

    vue3使用keep-alive组件,包含动态组件使用详解

    原因在于组件本身不应该被包装成响应式对象——只有组件的 props 和内部状态才需要响应。正确的做法是使用 markRaw 或 shallowRef:

    • 使用 markRaw
    const com = ref(markRaw(Child2));const comChange = () => {  if(com.value === Child2){    com.value = markRaw(Child);  }else{    com.value = markRaw(Child2);  }}
    • 使用 shallowRef
    const com = shallowRef(Child2);const comChange = () => {  if(com.value === Child2){    com.value = Child;  }else{    com.value = Child2;  }}

    完整示例

    运行后可以看到,只有 Child2 组件有缓存行为(生命周期中会触发 activated/deactivated),Child 每次切换都会经历销毁和重新创建。

    vue3使用keep-alive组件,包含动态组件使用详解

    路由不使用keep-alive

    路由场景下的缓存稍微复杂一些。先看没有缓存的写法:

    • 组件
    • 路由index.ts
    import { createRouter, createWebHashHistory, createWebHistory } from 'vue-router'import Home from '@/views/Home.vue'const routes = [  {    path: '/Father',    name: 'Father',    component: () => import('@/views/Father.vue'),    children: [      {        path: 'Child',        name: 'Child',        component: () => import('@/views/Child.vue'),      },      {        path: 'Child2',        name: 'Child2',        component: () => import('@/views/Child2.vue'),      }    ],  }, ]const router = createRouter({  history: createWebHashHistory(),  routes})export default router

    vue3使用keep-alive组件,包含动态组件使用详解

    和组件级一样,每次路由切换,页面组件都会被销毁重建,表单状态自然也就丢失了。

    路由中使用

    Vue Router 4(对应 Vue 3)引入了 的 v-slot API,可以方便地实现路由级别的缓存。这里有一个关键点:v-if 不能加在 keep-alive 上,否则直接销毁整个缓存容器;正确的做法是将 v-if 放在内部 component 上,实现按需缓存。

    在路由配置中,通过 meta 属性标记哪些页面需要缓存:

    ...const routes = [  {    path: '/Father',    name: 'Father',    component: () => import('@/views/Father.vue'),    children: [      {        path: 'Child',        name: 'Child',        component: () => import('@/views/Child.vue'),      },      {        path: 'Child2',        name: 'Child2',        meta: {          keepAlive: true,  // 需要被keep-alive        },        component: () => import('@/views/Child2.vue'),      }    ],  }, ]...

    这样,只有 keepAlive: true 的路由页面会被缓存,其他页面正常销毁。页面进入时触发的生命周期顺序为:created → mounted → activated。

    vue3使用keep-alive组件,包含动态组件使用详解

    keep-alive生命周期

    被 keep-alive 包裹的组件会额外多出两个生命周期钩子,分别在 mounted 之后和 unMounted 之前触发:

    onActivated(() => {  console.log('Component is activated')})onDeactivated(() => {  console.log('Component is deactivated')})

    利用这两个钩子,可以在组件被缓存或重新激活时做一些订阅/取消订阅、数据刷新等操作,非常实用。

    vue3使用keep-alive组件,包含动态组件使用详解vue3使用keep-alive组件,包含动态组件使用详解

    总结

    以上就是 Vue 3 中使用 keep-alive 的完整实战指南,涵盖了组件内和路由层面的缓存方案,同时也指出了几个容易踩坑的地方——比如 keep-alive 内不能有注释、动态组件引用要用 markRaw 或 shallowRef、路由缓存的 v-if 要加在内部组件上等等。掌握这些细节后,缓存问题基本可以一次搞定,希望能在实际项目中帮上忙。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    Zookeeper如何在Debian上实现负载均衡
    Zookeeper如何在Debian上实现负载均衡

    在Debian上使用Zookeeper实现负载均衡,通常涉及以下几个步骤:1. 安装Zookeeper首先,你需要在Debian系统上安装Zookeeper。以下是安装步骤:# 更新包列表sudo apt update# 安装Zookeepersudo apt install zookeeper z

    Vue3中keep-alive缓存问题的解决方法
    Vue3中keep-alive缓存问题的解决方法

    针对Vue3中keep-alive缓存不更新或残留问题,可通过手动清除缓存、使用VueDevtools强制重建、清理第三方库缓存、自定义清理逻辑、在beforeDestroy钩子卸载资源、渐进式清理及路由重定向等方案解决,核心是确保缓存可控。

    跑步软件记录路程哪个好用 热门跑步APP推荐与实测对比
    跑步软件记录路程哪个好用 热门跑步APP推荐与实测对比

    市面上的跑步App越来越多,但真正好用的其实也就那么几款。今天就聊聊目前口碑和实用性都比较靠前的五款——它们各有侧重,有的擅长AI定制化训练,有的在数据复盘上做得极深,总有一款适合你的运动节奏。 1、《Keep》——AI驱动的全能型运动助手 Keep早已不只是一个运动记录工具。它内置的AI智能运动系

    户外跑步记录公里数的app有哪些 好用的跑步记录软件推荐
    户外跑步记录公里数的app有哪些 好用的跑步记录软件推荐

    Keep、悦跑圈、运动跑步计、开薪运动、行者五款跑步记录App各具特色。Keep定位稳定且支持健身训练;悦跑圈轨迹精准无广告;运动跑步计极简风格含智能省电;开薪运动启动快并附加健康提醒;行者适配跑步、徒步、骑行,精准记录海拔等数据。

    便捷的手环app下载通用版大全 多功能的手环app前五
    便捷的手环app下载通用版大全 多功能的手环app前五

    智能手环的价值,很大程度上取决于它的软件适配能力。硬件再出色,如果配套应用体验跟不上,数据就只能躺在设备里睡大觉。正因如此,挑选一款好用的App,往往比纠结手环型号更关键。下面这几款应用,是市场上经过验证的选择。 《Keep》 数据追踪相当全面。身体各项指标的变化、每一次运动的轨迹与数据,都能被完整

    keep运动时如何关闭背景音乐
    keep运动时如何关闭背景音乐

    在 Keep 上跟练的时候,背景音乐有时候反而成了干扰——尤其是你想专注感受呼吸节奏或者动作发力的时候。那到底怎么把它关掉?操作路径其实很清晰,跟着下面几步走就行。 keep运动的时候怎么关闭背景音乐 一、进入运动页面 打开 Keep 应用,选好你要做的运动项目(比如跑步、骑行或者力量训练),系统会

    拍照识别食物热量的APP推荐 一键拍照精准估算卡路里
    拍照识别食物热量的APP推荐 一键拍照精准估算卡路里

    说到用APP管理饮食热量,很多人第一反应是“太麻烦”或者“根本坚持不下来”。确实,传统的方法——每顿饭都要查食材、称重量、手动输入,光是想想就让人打退堂鼓。不过,这几年图像识别技术成熟了不少,市面上已经有好几款应用能把这件事变得像拍张照片一样简单。下面这几款,值得认真看看。 《Keep》 先说说这个

    小米手环app有什么 热门手环类APP推荐
    小米手环app有什么 热门手环类APP推荐

    五款手环App各具特色:Keep提供智能教练与实时心率调整;倾行关注全天运动与睡眠闭环管理;宥马运动主打社交竞技与挑战激励;趣运动专注户外轨迹记录与心率预警;汇运动实现运动与饮食热量闭环。选对App,手环可成为主动的健康伙伴。

    有哪些手机运动健康app好用 手机运动健康软件下载分享
    有哪些手机运动健康app好用 手机运动健康软件下载分享

    运动和健康管理这件事,说难不难,说容易也不容易,关键就在于能否长期坚持。好在现在智能手机上有一大批优秀App,能把运动门槛降下来,让自律变得更有章可循。下面这几款都是经过市场验证的实用工具,各有侧重,按需选择就好。1、《Keep》这款软件开放了上万节精品课程,想练什么直接跟,运动门槛大幅降低。自研的

    keep如何刷跑步公里数
    keep如何刷跑步公里数

    在跑步锻炼中,有些人可能希望通过特定方式来刷跑步公里数以达成一些目标。以下为大家详细介绍keep刷跑步公里数的软件教程步骤方法。 先说一个核心前提:任何操作都建立在工具准备妥当的基础上。所以,第一步的准备工作,其实决定了后续流程能否顺畅进行。 一、准备工作 确保你的手机已经安装了最新版本的Keep应

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。