在 Vue v-for 中跳过 null items 和 null children

问题描述 投票:0回答:5
vue.js null html-lists v-for
5个回答
33
投票

一个简单的

v-if
可能会起作用:

<li v-for="item in items" v-if="item !== null" track-by="id">

试一试。如果没有,请这样做:

您可以为此添加一个过滤器(在您的 App 实例之前的

main.js
):

Vue.filter('removeNullProps', function(object) {
  return _.reject(object, (value) => value === null)
})

然后在模板中:

<li v-for="item in items | removeNullProps" track-by="id">
    <ol>
        <li v-for="child in item.children | removeNullProps" track-by="id"></li>
    </ol>
</li>

17
投票

在 Vue 2 中,过滤器已在

v-for
s 中弃用。

现在你应该使用计算属性。下面的演示。

new Vue({
  el: '#app',
  data: {
    items: [
      'item 1',
      'item 2',
      null,
      'item 4',
      null,
      'item 6'
    ]
  },
  computed: {
    nonNullItems: function() {
      return this.items.filter(function(item) {
        return item !== null;
      });
    }
  }
})
<script src="https://unpkg.com/vue@2"></script>
<div id="app">
  Using a computed property:
  <ul>
    <li v-for="item in nonNullItems">
      {{ item }}
    </li>
  </ul>
  <hr>
  Using v-if:
  <ul>
    <li v-for="item in items" v-if="item !== null">
      {{ item }}
    </li>
  </ul>
</div>


4
投票

我建议你不要在同一个元素中使用 v-if 和 v-for。我发现有效但不影响性能的是:

<li v-for="(value, key) in row.item.filter(x => x !== null)" :key="key"{{value}}</li>

你只需要在你正在经历的数组上运行过滤函数。这是 c# 中的常见用法,发现它在 JavaScript 中也没有什么不同。这基本上会在迭代时跳过空值。

希望这会有所帮助(3 年后)。


3
投票

只需使用

v-if
来处理它。但首先,不要使用
track-by="id"
因为
null
项目和
null
孩子。您可以在此处查看演示 https://jsfiddle.net/13mtm5zo/1/

也许更好的方法是在渲染之前先处理数据。


0
投票

Vue.Js 风格指南告诉我们:

“永远不要在与 v-for 相同的元素上使用 v-if。”

如何根据 Vue 风格指南正确处理 v-if 和 v-for:

<ul v-if="shouldShowUsers">
  <li
    v-for="user in users"
    :key="user.id"
  >
    {{ user.name }}
  </li>
</ul>

在此处查看有关如何使用

v-if
处理
v-for
的更多信息:https://v2.vuejs.org/v2/style-guide/#Avoid-v-if-with-v-for-essential

© www.soinside.com 2019 - 2024. All rights reserved.