vue动态组建实现原理
Vue 动态组件实现原理
Vue 动态组件的核心是通过 <component> 标签和 is 属性实现的,底层依赖 Vue 的组件系统与响应式机制。
核心机制
动态组件的 is 属性可以接收以下类型的值:

- 已注册的组件名(字符串)
- 组件选项对象(直接导入的组件)
- 异步组件(Promise 或工厂函数)
<template>
<component :is="currentComponent"></component>
</template>
实现流程
-
模板编译阶段
- Vue 编译器将
<component>标签解析为特殊的渲染函数 - 生成带有
is属性检查的逻辑分支代码
- Vue 编译器将
-
运行时处理

- 根据
is的当前值解析出实际组件 - 通过
resolveDynamicComponent方法处理不同类型的is值 - 最终返回标准化后的组件选项对象
- 根据
-
组件切换
- 依赖响应式系统监听
is属性的变化 - 当值变化时触发重新渲染
- 新旧组件对比遵循常规的组件更新逻辑
- 依赖响应式系统监听
关键源码片段
在 Vue 3 中,相关处理位于 runtime-core/src/helpers/resolveAssets.ts:
export function resolveDynamicComponent(component: unknown): VNodeTypes {
if (isString(component)) {
return resolveAsset(COMPONENTS, component) || component
} else {
return component || NULL_DYNAMIC_COMPONENT
}
}
性能优化
- keep-alive 集成
- 配合
<keep-alive>可缓存组件实例 - 避免重复创建销毁带来的性能开销
- 配合
<keep-alive>
<component :is="currentComponent"></component>
</keep-alive>
- 异步组件支持
- 动态组件天然支持异步组件加载
- 可实现代码分割和懒加载优化
注意事项
- 频繁切换动态组件可能导致内存增长
- 非 keep-alive 模式下组件状态不会保留
- 组件注册需确保在渲染前完成






