VueJs中如何条件化定义导入组件实现动态子组件渲染
实现方案
你给出的示例代码无法正常生效:components 配置项的解析发生在组件实例初始化阶段,仅会执行一次,既访问不到后续初始化完成的 computed、data 等实例属性,也不会在响应式状态变化时重新解析组件映射,没法实现动态切换效果。
无需使用 v-if/v-else,以下两种方案都可以实现需求:
方案1:官方内置动态组件(推荐)
Vue 原生提供 <component :is=""> 语法支持动态组件渲染,完全不需要条件指令。is 绑定的值变化时,Vue 会自动卸载旧组件、挂载匹配的新组件,是官方推荐的标准实现:
<template> <component :is="currentChild" /> </template> <script> import A from './components/A.vue'; import B from './components/B.vue'; export default { name: 'Parent', components: { A, B }, computed: { currentChild() { return Math.random() < 0.5 ? A : B } } } </script>
如果需要保留组件切换时的内部状态,直接用 <KeepAlive> 包裹 <component> 标签即可。
方案2:保留<Child />的模板写法
Vue 解析模板标签时,会优先查找当前组件实例上的同名属性,如果属性值是合法的组件配置对象,会直接将其作为组件渲染。你可以直接将 Child 定义为返回组件的计算属性,不需要在 components 中注册,就能实现你预期的模板写法,同时支持响应式切换:
<template> <Child /> </template> <script> import A from './components/A.vue'; import B from './components/B.vue'; export default { name: 'Parent', computed: { Child() { return Math.random() < 0.5 ? A : B } } } </script>
注意事项
- 该写法兼容 Vue2、Vue3 所有版本
- 组件命名不要和原生 HTML 标签重名,否则标签会被优先解析为原生 DOM 元素
- 支持异步组件场景,计算属性中可以直接返回异步组件的加载结果
内容的提问来源于stack exchange,提问作者molvg
相关产品推荐
相关产品推荐

