最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Vue 基础如何通过动态组件(`<component :is>`)灵活切换渲染不同的子组件
时间:2026-08-23 12:41:48 编辑:袖梨 来源:一聚教程网
直接用 :is 绑定响应式变量可灵活切换动态组件,支持字符串名(如'user-profile')或组件对象(含异步加载),需提前局部或全局注册;配合 <keep-alive> 可缓存状态,避免重复销毁重建,并注意 SSR 同步引入与空值兜底。
`)灵活切换渲染不同的子组件">
直接用 `
绑定方式:字符串名 or 组件对象
`:is` 接收两类值,选一种即可:
- 已注册的组件名称字符串,比如
'UserForm'、'ProductList',注意命名推荐用 kebab-case(如'user-profile'),避免大小写混淆 - 直接导入的组件对象,适合配合
defineAsyncComponent做懒加载,例如:import { defineAsyncComponent } from 'vue'const AsyncChart = defineAsyncComponent(() => import('./Chart.vue'))
然后绑定
:is="AsyncChart"
必须提前注册目标组件
动态组件不会自动识别未声明的组件,所以得确保目标组件已在当前作用域注册:
- 局部注册:在父组件的
components选项里显式声明,如components: { UserForm, ProductList } - 全局注册(适合复用多处):在
main.js中调用app.component('UserForm', UserForm) - 不注册就绑定,Vue 会静默渲染为空白,无报错——调试时建议加兜底逻辑,比如
computed返回默认占位组件
保持状态:用 <keep-alive> 缓存实例
默认每次切换都会销毁旧组件、新建新组件,表单输入、滚动位置等全丢。加一层 <keep-alive> 即可解决:
- 写法:
<keep-alive><component :is="currentComp"></component></keep-alive> - 被缓存的组件不再走
beforeUnmount/unmounted,而是触发activated和deactivated钩子,适合做数据拉取或资源清理 - 支持
include或exclude属性,精准控制哪些组件参与缓存,例如<keep-alive include="UserForm,ProductList">
实用技巧与避坑点
常见场景下几个关键提醒:
- 别在
:is里写三元表达式,如:is="type === 'form' ? FormComp : ListComp",应提前在computed或ref中算好再绑定 - Tab 切换、权限路由、表单步骤等场景,把组件名存在数组或对象里统一管理,点击事件只更新索引或 key,逻辑更清晰
- SSR 环境中,所有可能被
:is加载的组件必须同步引入,否则客户端 hydration 会出错 - 值为
null、undefined或未注册名时,Vue 不报错也不提示,建议加校验或 fallback 组件提升健壮性
相关文章
- 小米路由器掉速怎么解决(小米路由器掉速解决方式) 08-23
- poki小游戏入口免费点击即玩 08-23
- 小米ar67路由器可否提供电视频道(小米ar67路由器会提供电视频道吗) 08-23
- premiere如何制作弧形字幕 08-23
- 爱剪辑如何制作打字消失的动画效果 08-23
- 讯飞听见语音流处理机制与实时通信技术如何解析 08-23