如果值为null,则跳过对象项

Kin*_*ien 10 vue.js

for ... in在vue js中有一个嵌套循环.我想要的是跳过元素,如果元素的值是null.这是html代码:

<ul>
    <li v-for="item in items" track-by="id">
        <ol>
            <li v-for="child in item.children" track-by="id"></li>
        </ol>
    </li>
</ul>
Run Code Online (Sandbox Code Playgroud)

null元素可以存在于对象itemitem.children对象中.

例如:

var data = {
   1: {
      id: 1,
      title: "This should be rendered",
      children: {
          100: {
              id: 100,
              subtitle: "I am a child"
          },
          101: null
      }
   },
   2: null,
   3: {
       id: 3,
       title: "Should should be rendered as well",
       children: {}
   }
};
Run Code Online (Sandbox Code Playgroud)

由于此数据data[1].children[101]不应呈现,如果data[1].children[100]以后变为null,则应从列表中省略.

PS我知道这可能不是表示数据的最佳方式,但我不负责任:)

Lin*_*org 15

编辑:实际上,一个简单的v-if可能有效:

<li v-for="item in items" v-if="item !== null" track-by="id">
Run Code Online (Sandbox Code Playgroud)

试试看.如果没有,请执行此操作:

您可以为其添加过滤器(在App实例之前的main.js中):

Vue.filter('removeNullProps',function(object) {
  // sorry for using lodash and ES2015 arrow functions :-P
  return _.reject(object, (value) => value === null)
})
Run Code Online (Sandbox Code Playgroud)

然后在模板中:

<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>
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,Vue js样式指南建议避免在同一元素上使用v-for和v-if。https://vuejs.org/v2/style-guide/ (4认同)

acd*_*ior 7

在Vue 2中,过滤器已在v-fors中弃用。

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

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;
      });
    }
  }
})
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)