vue动态组件本质是通过按需加载,解决重复模板、状态丢失和逻辑耦合问题;支持字符串名或组件对象绑定,需白名单校验防注入;配合保留状态,支持异步加载与原生标签切换。
` 的应用技巧">
Vue 的动态组件机制本质是用一个“占位符”按需加载真实组件,核心就是 <component :is="..."></component>。它不是为了炫技,而是解决重复模板、状态丢失、逻辑耦合这些实际问题。
绑定方式要选对:字符串名 vs 组件对象
两种主流写法各有适用场景:
- 用注册的组件名(字符串):适合组件数量固定、命名清晰的场景。必须先在
components选项里声明,:is才能识别,比如:is="'UserProfile'"; - 用导入的组件对象:更适合 Composition API 或需要直接控制实例的情况,比如
:is="currentTabComponent",其中currentTabComponent是ref()或shallowRef()包裹的组件模块; - 避免把用户输入或接口返回的原始字符串直接塞进
:is,存在注入风险。应做白名单校验,或提前映射为安全值。
状态不丢:加 <keep-alive></keep-alive> 不是可选项
默认每次切换,旧组件会卸载、销毁、清空数据。如果用户在表单里填了一半内容,切走再切回来就没了——这不是体验问题,是逻辑缺陷。
递归分析 Vue 项目组件依赖,从入口文件生成组件层级图,支持 Vue 2/3,输出组件名、文件路径和属性。适用于分析组件结构、排查依赖或了解项目架构。
加上 <keep-alive></keep-alive> 就能保留整个组件实例:
- 组件首次加载后进入缓存,后续切换只是激活/停用,不重建;
- 配合
activated和deactivated生命周期钩子,可做数据刷新或资源释放; - 注意:只对有名字(
name选项)的组件生效,异步组件需确保 resolve 后的组件有合法 name。
按需加载::is 支持异步组件
大项目里,不是所有组件都要一开始就打包进来。你可以把 :is 指向一个动态 import 表达式:
- 写法如
:is="() => import('./ReportChart.vue')",Vue 会自动处理加载、错误、占位; - 适合用在模态框内容、后台报表页、权限隔离模块等低频但体积大的场景;
- 和
<keep-alive></keep-alive>搭配时要注意:异步组件被缓存的是加载后的实例,不是 Promise,所以第二次访问不会重复请求。
别忽略 is 还能指向原生标签
:is 的值不局限于 Vue 组件,也可以是 'div'、'span'、'table' 等合法 HTML 标签名。
- 可用于生成语义化结构,比如根据配置决定用
<article></article>还是<section></section>包裹内容; - 结合属性透传(
v-bind="$attrs"),能做出高度通用的内容容器; - 慎用于
style或script标签——虽然技术上可行,但易引发样式污染或执行时机不可控。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










