【问题标题】:Nested array loop in vue?vue中的嵌套数组循环?
【发布时间】:2017-08-16 17:54:54
【问题描述】:

如何使用 v-for 循环如下所示的 JSON 对象? 我想循环所有 ID/数字,以及每个数字内的所有项目,并将其全部显示在列表中...... 我知道我可以使用v-for="item in system_events" 轻松循环所有 system_events 但是我如何循环所有不同的 ID/数字,以及里面的所有项目?

我的 JSON 看起来像:

{
    "system_events": {
        "1013": [{
                "id": 25899,
                "timestamp": "2017-08-15T21:26:42Z",
                "type": "alarm",
                "code": 190,
                "title": "",
                "description": "",
                "appeared": "2017-08-15T21:26:40Z",
                "disappeared": null,
                "acknowlegded": null,
                "solved": null,
                "system_name": "Randers pr 44b sidste station"
            }, {
                "id": 26157,
                "timestamp": "2017-08-15T21:32:17Z",
                "type": "alarm",
                "code": 190,
                "title": "",
                "description": "",
                "appeared": "2017-08-15T21:32:06Z",
                "disappeared": null,
                "acknowlegded": null,
                "solved": null,
                "system_name": "Randers pr 44b sidste station"
            }
        ],
        "1015": [{
                "id": 23777,
                "timestamp": "2017-08-15T20:38:08Z",
                "type": "alarm",
                "code": 191,
                "title": "",
                "description": "",
                "appeared": "2017-08-15T20:38:00Z",
                "disappeared": null,
                "acknowlegded": null,
                "solved": null,
                "system_name": "Favrskov Svenstrup gyvelvej"
            }, {
                "id": 23779,
                "timestamp": "2017-08-15T20:38:08Z",
                "type": "alarm",
                "code": 190,
                "title": "",
                "description": "",
                "appeared": "2017-08-15T20:37:58Z",
                "disappeared": null,
                "acknowlegded": null,
                "solved": null,
                "system_name": "Favrskov Svenstrup gyvelvej"
            }
        ]
    }
}

【问题讨论】:

  • 只需在第一个 v-for 元素内添加另一个 v-for="subitem in item" 元素

标签: vue.js vuejs2


【解决方案1】:

另一种方法是使用计算属性来简化数据结构:

new Vue({
  el: '#app',
  data: {
    system_events: {"1013":[{"id":25899},{"id":26157}],"1015":[{"id":23777},{"id":23779}]}    
  },
  computed: {
    allEvents: function() {
      return Object.values(this.system_events)
        .reduce((a, b) => a.concat(b), [])
    }
  }
})
<script src="https://unpkg.com/vue"></script>

<div id="app">
  <ul>
    <li v-for="event in allEvents">{{event.id}}</li>
  </ul>
</div>

这允许您在模板中使用一个简单的循环,从而使您的标记结构更加清晰。

如果您正在处理大型数据集,并且/或者数据经常发生变异,您可能需要测试这两种方法的性能。我不知道哪个会更好。

【讨论】:

  • 我现在宁愿使用它而不是我的解决方案!特别是因为您可以使用array.flat。它can be used 自 chrome 69 或带有 babel。 return Object.values(this.system_events).flat()
  • 感谢@UlysseBN 的编辑。关于array.flat的好点。
【解决方案2】:

除了伯特的回答,我会说你可以使用template 标签来不渲染主框架。例如,如果您想要一个干净的 HTML ul&gt;li 仅用于子项,这很有用。

const vue = new Vue({
  el: "#app",
  data: {
    system_events: {"1013":[{"id":25899},{"id":26157}],"1015":[{"id":23777},{"id":23779}]}
  }
});
<script src="https://unpkg.com/vue@2.2.6/dist/vue.js"></script>

<div id="app">
  <ul>
    <template v-for="item in system_events">
      <li v-for="event in item">{{ event.id }}</li>
    </template>
  </ul>
</div>

【讨论】:

  • 在这种情况下你应该使用template,而不是slot
  • 已编辑,但我可以知道原因吗? I saw this,但也许你有更准确的
  • &lt;slot&gt; 用于交织内容。 &lt;template&gt; 只是您想要的逻辑(在这种情况下,外部 for 循环)没有任何伴随的 DOM 节点。
  • 就像 Terry 说的,使用templates 用于组件内的内容组合,slots 用于组件之间的内容分发。未命名的slot 标记中的任何内容都将替换为组件标记的内容。请参阅此示例:jsfiddle.net/q70aw981
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-11
  • 1970-01-01
  • 1970-01-01
  • 2022-05-12
  • 2020-05-13
  • 2020-08-25
  • 2013-09-22
相关资源
最近更新 更多