vue 动态组件实现
vue 动态组件实现
Vue 的动态组件功能允许根据条件或用户交互动态切换不同的组件,主要通过 <component> 标签和 is 属性实现。
基本用法
通过 is 属性绑定组件名或组件选项对象,动态渲染目标组件:
<template>
<component :is="currentComponent"></component>
</template>
<script>
import ComponentA from './ComponentA.vue';
import ComponentB from './ComponentB.vue';
export default {
data() {
return {
currentComponent: 'ComponentA'
};
},
components: {
ComponentA,
ComponentB
}
};
</script>
动态切换组件
通过方法或用户交互修改 currentComponent 的值实现组件切换:
<template>
<button @click="toggleComponent">切换组件</button>
<component :is="currentComponent"></component>
</template>
<script>
export default {
data() {
return {
currentComponent: 'ComponentA'
};
},
methods: {
toggleComponent() {
this.currentComponent = this.currentComponent === 'ComponentA'
? 'ComponentB'
: 'ComponentA';
}
}
};
</script>
保持组件状态
默认情况下切换组件会销毁旧组件实例,使用 <keep-alive> 包裹可保留状态:
<template>
<keep-alive>
<component :is="currentComponent"></component>
</keep-alive>
</template>
传递 props 和事件
动态组件支持常规的 props 传递和事件监听:
<template>
<component
:is="currentComponent"
:msg="message"
@custom-event="handleEvent"
></component>
</template>
异步组件
结合动态导入实现按需加载组件:
const AsyncComponent = () => import('./AsyncComponent.vue');
export default {
components: {
AsyncComponent
}
};
动态组件名
组件名可以是动态计算的:
computed: {
componentName() {
return this.condition ? 'ComponentA' : 'ComponentB';
}
}
注意事项
- 动态组件名需在
components选项中注册 - 频繁切换可能影响性能,可考虑
v-show替代 - 使用
key属性强制重新创建组件实例
通过以上方式可灵活实现各种动态组件场景,如标签页、向导式表单等交互模式。







