我正在使用Vue JS创建一个包含一个通用列表项组件的列表。如果存在满足正确类型的非通用组件,则将使用自定义组件。
<email-queue-item v-for="item in queue"
:key="item.id"
:item="item"
v-if="type == 'EmailMessage'"></email-queue-item>
<queue-item v-for="item in queue"
:key="item.id"
:item="item"
v-else></queue-item>
上面的代码更好地说明了我要做的事情。我似乎有的问题是由于循环首先创建两个列表,然后检查条件。是否有一种方法可以在类型上选择正确的组件花瓶,然后遍历列表?
用于显示这些组件的数据如下:
{
name: Email,
type: EmailMessage,
data:[
{...},
{...},
...
]
}
答案 0 :(得分:3)
动态组件使模板非常简单:
<component
:is="type == 'EmailMessage' ? 'email-queue-item' : 'queue-item'"
v-for="item in queue"
:key="item.id"
:item="item"
/>
答案 1 :(得分:0)
如果我没有正确理解,你就喜欢使用动态组件进行v-for。
所以请检查Vue Official Guide: dynamic component,然后下面的演示将使用v-bind:is
:
Vue.config.productionTip = false
Vue.component('email-queue-item', {
template: `<div><h3 :style="{'background-color':color}">Email: {{color}}</h3></div>`,
props: ['color']
})
Vue.component('message-queue-item', {
template: `<div><h1 :style="{'background-color':color}">Message: {{color}}</h1></div>`,
props: ['color']
})
new Vue({
el: '#app',
data() {
return {
items: [
{'component':'email-queue-item', 'color':'red'},
{'component':'message-queue-item', 'color':'blue'},
{'component':'email-queue-item', 'color':'green'}
]
}
}
})
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.16/vue.js"></script>
<div id="app">
<div v-for="(item, index) in items" :key="index" :color="item.color" :is="item.component"></div>
</div>
&#13;