具有不同组件的Vue JS循环

Joh*_*Doe 4 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>
Run Code Online (Sandbox Code Playgroud)

上面的代码更好地说明了我正在尝试做的事情。我似乎遇到的问题是到期循环首先创建两个列表,然后检查条件列表。是否有办法在类型上选择正确的组件花瓶,然后遍历列表?

用于显示这些组件的数据如下所示:

{
    name: Email,
    type: EmailMessage,
    data:[
        {...},
        {...},
        ...
    ]
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*mas 5

动态组件使模板中的工作变得非常简单:

<component
    :is="type == 'EmailMessage' ? 'email-queue-item' : 'queue-item'"
    v-for="item in queue"
    :key="item.id"
    :item="item"
/>
Run Code Online (Sandbox Code Playgroud)


Sph*_*inx 3

如果我理解正确的话,你会想要带有动态组件的 v-for 。

所以查看Vue 官方指南:动态组件,然后演示将如下所示,其中使用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'}
      ]
    }
  }
})
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)