【问题标题】:How to bind dynamic props to dynamic components in VueJS 2如何在 VueJS 2 中将动态道具绑定到动态组件
【发布时间】:2017-10-11 06:20:13
【问题描述】:

我想知道如何迭代组件名称列表(来自对 API 服务器的 AJAX 调用)并将它们呈现为组件,并将相关属性传递给每个组件(即动态绑定它们的属性) .

到目前为止,我已经成功地迭代了代表组件的 JSON 项目列表,并成功渲染了这些组件。我现在想做的是使用v-bind 绑定每个组件的属性。

在下面的示例中,item-one 组件将接收具有item1.jpg 值的image 属性;并且item-two 组件不会接收任何属性。

<template>
  <div v-for="item in items">
    <component :is="Object.keys(item)[0]" :v-bind="???"></component>
  </div>
</template>

<script>
  import ItemOne from '../components/item-one'
  import ItemTwo from '../components/item-two'

  export default {
    components: {
      ItemOne,
      ItemTwo
    },
    asyncData () {
      return {
        items: [
          { 'item-one': { 'image': 'item1.jpg' } },
          { 'item-two': { } }
        ]
      }
    }
  }
</script>

我尝试使用:v-bind="Object.values(Object.keys(item)[0])",但我在渲染元素中获得了v-bind="[object Object]" 属性。

【问题讨论】:

  • 只是v-bind。没有冒号
  • @thanksd 仍然不起作用。
  • 应该是v-bind="item[Object.keys(item)[0]]"。可能有助于更改items 的结构。
  • 是的,我对如何构建它感到困惑,但我真的很喜欢你重构的简单性。更容易推理,几乎不言自明。

标签: javascript vue.js vuejs2 vue-component nuxt.js


【解决方案1】:

首先,您需要去掉v-bind 之前的冒号。当作为属性前缀时,冒号是v-bind 的简写。但是,当传递一个键对对象进行绑定时,您只需使用v-bind 指令。

其次,您没有正确引用每个项目的属性。您可以像这样引用它们:

v-bind="item[Object.keys(item)[0]]"

如果您稍微更改了items 属性的结构,则不需要使用Object.keys

items: [{ 
  type: 'item-one', 
  props: { 'image': 'item1.jpg' },
}, {
  type: 'item-two',
}]

这样,通过事先明确标记组件类型和属性,您的模板会更容易理解:

<div v-for="item in items">
  <component :is="item.type" v-bind="item.props"></component>
</div>

【讨论】:

  • 有效!很好的答案,你让我很开心。我非常喜欢您重构的易读性并已应用它。我不得不从你上面的答案中的v-bind 中删除冒号;-)
猜你喜欢
  • 1970-01-01
  • 2018-08-03
  • 2021-07-08
  • 2021-04-03
  • 1970-01-01
  • 1970-01-01
  • 2018-11-07
  • 2020-10-24
相关资源
最近更新 更多