You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue3 Composition API中<component :is>动态组件渲染失败问题

问题原因

Vue3 使用 <script setup> 语法时,模板编译作用域和脚本内的变量作用域直接绑定,不会像Vue2 Options API那样自动将导入的组件按组件名做字符串映射匹配。
当你给:is传入接口返回的普通字符串值(比如"selectinput"/"SelectInput")时,Vue找不到该字符串对应的组件对象引用,就会把它当做原生自定义HTML标签渲染,最终就出现了你看到的<selectinput>空标签,不会加载本地导入的自定义组件。
而你硬编码绑定导入的SelectInput组件变量时,传入的是实际的组件对象,因此可以正常渲染。

解决方案

手动维护一个「组件类型标识 -> 组件对象」的映射表,动态渲染时根据接口返回的type值从映射表中取出对应的组件对象,传给:is即可。
修改后的完整代码如下:

<template>
    <div class="item-group section-wrap">
        <div :key="question.guid" class='component-wrap'>
            <div class="component-container">
                <component :is="componentMap[question.type]" :propData="question" />
            </div>
        </div>
    </div>
</template>

<script setup>
import { defineProps, toRefs } from 'vue';
import SelectInput from "./SelectInput";
import TextareaInput from "./TextareaInput";

// 组件映射表,key必须和接口返回的question.type值完全一致
const componentMap = {
    SelectInput,
    TextareaInput
    // 后续新增动态组件,在此处补充对应映射即可
}

const props = defineProps({
    question: Object,
});

const { question } = toRefs(props);
</script>
注意事项
  • 映射表的key必须和接口返回的question.type值完全匹配:如果接口返回的是小写selectinput,映射表就要写成selectinput: SelectInput;如果返回的是短横线命名select-input,key就对应写select-input
  • 该方案是局部注册映射,支持tree-shaking,不会引入冗余代码,比全局注册组件更适合构建工具的生产环境优化
  • <script setup>模式下,不要直接给:is传未做映射的纯字符串,这类值只会被识别为原生HTML标签名,不会匹配到你导入的本地组件

内容的提问来源于stack exchange,提问作者Bryan88

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 22:09:20