使用Vue 3.2.41-英雄图标/版本2.0.14-惯性1.0-版本4.0.0
我使用以下代码调用Vue组件:<TimelineItem icon="CalendarDaysIcon" />
该组件如下所示:
<template>
<component :is="icon" /> <!-- doesn't work -->
<CalendarDaysIcon /> <!-- works -->
</template>
<script setup>
import {
CalendarDaysIcon,
} from '@heroicons/vue/20/solid'
const props = defineProps(['icon'])
</script>
呈现的HTML如下所示:
<calendardaysicon></calendardaysicon> <!-- not what I want -->
<svg> ... </svg> <!-- correct but not dynamic -->
换句话说,<component :is />
只是渲染了一些空的<calendardaysicon>
标记,而我希望它渲染组件。我可以看到它将其变为小写,不知道如何强制它返回PascalCase,我甚至不确定这是否会对情况有所帮助。
我已经简化了一些代码,但完整版本将有一个10个不同的图标列表(所有的英雄包使用PascalCase名称的一部分),我希望能够轻松地从主组件调用。
3条答案
按热度按时间nkhmeac61#
如果您直接在DOM中创作模板(例如,作为本地元素的内容),则模板将受浏览器的本地HTML解析行为的影响。在这种情况下,您需要对组件www.example.com使用kebab-case和显式结束标记https://vuejs.org/guide/essentials/component-basics.html#dom-template-parsing-caveats
尝试:
<calendar-days-icon> </calendar-days-icon>
irlmq6kh2#
xu3bshqb3#
使用
<component :is="icon" />
只是使用包含CalendarDaysIcon
的字符串相反,在主组件中,按如下方式传递实际组件引用:
然后,在
TimelineItem
组件中,不需要引用任何图标:感谢惯性失调服务器上的
@Robert Boes
提供的指导。