Vue JS循环使用不同的组件

时间:2018-05-18 20:22:37

标签: vue.js vuejs2

我正在使用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:[
        {...},
        {...},
        ...
    ]
}

2 个答案:

答案 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

&#13;
&#13;
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;
&#13;
&#13;