Component 可以根据数据命名吗?
Can a Component be named from data?
我有三个组件图标 <DiscoverIcon>
、<FeedIcon>
、<ProfileIcon>
并且在选项卡循环中我希望能够为每个标题使用不同的图标。
我试过
这样的列表元素
{ key: 1, icon: <div class='iconbgd'><DiscoverIcon /></div>, text: 'Discover', route: '/discover'}
并调用 {{ link.icon }}
以及
{ key: 1, text: 'Discover', route: '/discover'}
并调用 <div class='iconbgd'><{{link.text}}Icon /></div>
<template>
<v-tabs fixed-tabs>
<v-tab
v-for="link in links"
:key="link.key"
>
<div class='iconbgd'><{{link.text}}Icon /></div><h4>{{ link.text }}</h4>
</v-tab>
</v-tabs>
</template>
<script>
import DiscoverIcon from '../components/icons/DiscoverIcon'
import FeedIcon from '../components/icons/FeedIcon'
import ProfileIcon from '../components/icons/ProfileIcon'
export default {
components: {
DiscoverIcon,
FeedIcon,
ProfileIcon
},
name: 'App',
data () {
return {
links: [
{ key: 1, icon: <div class='iconbgd'><DiscoverIcon /></div>, text: 'Discover', route: '/discover'},
{ key: 2, icon: <div class='iconbgd'><FeedIcon /></div>, text: 'Feed', route: '/feed'},
{ key: 3, icon: <div class='iconbgd'><ProfileIcon /></div>, text: 'Profile', route: '/profile'}
]
}
}
}
</script>
<style>
.iconbgd svg{
fill:url(#grad1);
width: 30px;
height: auto;
padding-right: 5px;
}
</style>
这是这个用例的 Vuetify 选项卡组件,但让它工作与使用选项卡无关,但我的预期结果是能够循环并在每个选项卡中使用不同的相关组件,而不仅仅是创建我目前拥有的三个独立按钮。
首先 {{link.icon}}
并不是要显示为 HTML。您应该使用不同的方法。
<div class='iconbgd'><{{link.text}}Icon />
等于 <div class='iconbgd' v-text="link.text"><Icon />
。因此 Vue 有一个 v-html
指令用于 HTML,你可以阅读 here more about the varieties of directives.
尽可能避免 v-html
,因为不同的 {{link.icon}}
非常相似,您可以在没有 v-html
.
的情况下轻松工作
您似乎在尝试绑定组件 <{{link.text}}Icon />
。 Dynamic components 是你要找的,他们非常强大。
我很快查看了 v-tabs
的 Vuetify 文档并对其进行了一些更改,但是我以前从未使用过它,并且未测试。它应该是你想要完成的:
<template>
<v-tabs fixed-tabs>
<v-tab v-for="link in links" :key="link.key">
<div class="iconbgd">{{link.label}}</div>
</v-tab>
<v-tab-item v-for="link in links" :key="link.key">
<h4>{{link.label}}</h4>
<component :is="link.label + 'Icon'" :key="link.key"/>
</v-tab-item>
</v-tabs>
</template>
<script>
import DiscoverIcon from '../components/icons/DiscoverIcon';
import FeedIcon from '../components/icons/FeedIcon';
import ProfileIcon from '../components/icons/ProfileIcon';
export default {
data() {
return {
links: [
{
key: 1,
label: 'Discover',
route: '/discover'
},
{
key: 2,
label: 'Feed',
route: '/feed'
},
{
key: 3,
label: 'Profile',
route: '/profile'
}
]
};
},
name: 'App',
components: {
DiscoverIcon,
FeedIcon,
ProfileIcon
}
};
</script>
<style>
.iconbgd svg {
fill: url(#grad1);
width: 30px;
height: auto;
padding-right: 5px;
}
</style>
非常感谢!对此进行一些调整,它正在运行。
<v-tabs fixed-tabs color='transparent' slider-color='#1341B2'>
<v-tab v-for="link in links" :key="link.key" :to="link.route">
<div class="iconbgd">
<component :is="link.label + 'Icon'" :key="link.key"/>
</div>
<h4>{{link.label}}</h4>
</v-tab>
</v-tabs>
我有三个组件图标 <DiscoverIcon>
、<FeedIcon>
、<ProfileIcon>
并且在选项卡循环中我希望能够为每个标题使用不同的图标。
我试过
这样的列表元素{ key: 1, icon: <div class='iconbgd'><DiscoverIcon /></div>, text: 'Discover', route: '/discover'}
并调用 {{ link.icon }}
以及
{ key: 1, text: 'Discover', route: '/discover'}
并调用 <div class='iconbgd'><{{link.text}}Icon /></div>
<template>
<v-tabs fixed-tabs>
<v-tab
v-for="link in links"
:key="link.key"
>
<div class='iconbgd'><{{link.text}}Icon /></div><h4>{{ link.text }}</h4>
</v-tab>
</v-tabs>
</template>
<script>
import DiscoverIcon from '../components/icons/DiscoverIcon'
import FeedIcon from '../components/icons/FeedIcon'
import ProfileIcon from '../components/icons/ProfileIcon'
export default {
components: {
DiscoverIcon,
FeedIcon,
ProfileIcon
},
name: 'App',
data () {
return {
links: [
{ key: 1, icon: <div class='iconbgd'><DiscoverIcon /></div>, text: 'Discover', route: '/discover'},
{ key: 2, icon: <div class='iconbgd'><FeedIcon /></div>, text: 'Feed', route: '/feed'},
{ key: 3, icon: <div class='iconbgd'><ProfileIcon /></div>, text: 'Profile', route: '/profile'}
]
}
}
}
</script>
<style>
.iconbgd svg{
fill:url(#grad1);
width: 30px;
height: auto;
padding-right: 5px;
}
</style>
这是这个用例的 Vuetify 选项卡组件,但让它工作与使用选项卡无关,但我的预期结果是能够循环并在每个选项卡中使用不同的相关组件,而不仅仅是创建我目前拥有的三个独立按钮。
首先 {{link.icon}}
并不是要显示为 HTML。您应该使用不同的方法。
<div class='iconbgd'><{{link.text}}Icon />
等于 <div class='iconbgd' v-text="link.text"><Icon />
。因此 Vue 有一个 v-html
指令用于 HTML,你可以阅读 here more about the varieties of directives.
尽可能避免 v-html
,因为不同的 {{link.icon}}
非常相似,您可以在没有 v-html
.
您似乎在尝试绑定组件 <{{link.text}}Icon />
。 Dynamic components 是你要找的,他们非常强大。
我很快查看了 v-tabs
的 Vuetify 文档并对其进行了一些更改,但是我以前从未使用过它,并且未测试。它应该是你想要完成的:
<template>
<v-tabs fixed-tabs>
<v-tab v-for="link in links" :key="link.key">
<div class="iconbgd">{{link.label}}</div>
</v-tab>
<v-tab-item v-for="link in links" :key="link.key">
<h4>{{link.label}}</h4>
<component :is="link.label + 'Icon'" :key="link.key"/>
</v-tab-item>
</v-tabs>
</template>
<script>
import DiscoverIcon from '../components/icons/DiscoverIcon';
import FeedIcon from '../components/icons/FeedIcon';
import ProfileIcon from '../components/icons/ProfileIcon';
export default {
data() {
return {
links: [
{
key: 1,
label: 'Discover',
route: '/discover'
},
{
key: 2,
label: 'Feed',
route: '/feed'
},
{
key: 3,
label: 'Profile',
route: '/profile'
}
]
};
},
name: 'App',
components: {
DiscoverIcon,
FeedIcon,
ProfileIcon
}
};
</script>
<style>
.iconbgd svg {
fill: url(#grad1);
width: 30px;
height: auto;
padding-right: 5px;
}
</style>
非常感谢!对此进行一些调整,它正在运行。
<v-tabs fixed-tabs color='transparent' slider-color='#1341B2'>
<v-tab v-for="link in links" :key="link.key" :to="link.route">
<div class="iconbgd">
<component :is="link.label + 'Icon'" :key="link.key"/>
</div>
<h4>{{link.label}}</h4>
</v-tab>
</v-tabs>