vue.js确定空对象的正确方法

Fin*_*ers 11 vue.js

经典场景:我想显示一个列表,但是当它为空时我想显示"无数据".

事实上,做一些我希望简单的事情有点复杂,这让我觉得我可能做错了.

这是我目前的解决方案.

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="http://cdn.jsdelivr.net/vue/1.0.16/vue.js"></script>

<div id="element">
  <div v-if="empty">No item in inventory</div>
  <div v-for="(index, item) in inventory">
    {{item.key}}<button onclick="remove('{{index}}')">remove</button>
  </div>
</div>

<script type="text/javascript">
"use strict";
var vm;
$(function() {
    vm = new Vue({
        el: '#element',
        data: {
            inventory: {"id1" : {"key" : "val1"}, "id2" : {"key" : "val2"}},
            empty: false
        },
        watch: {
            inventory: function() {
                vm.empty = $.isEmptyObject(vm.inventory);
            }
        }
    });
});

function remove(key) {
  Vue.delete(vm.inventory, key);
}
</script>
Run Code Online (Sandbox Code Playgroud)

有没有比这更好的解决方案?

Sau*_*abh 18

您可以使用inventoryin的长度v-if,如下所示:

<div id="element">
  <div v-if="inventory.length">No item in inventory</div>
  <div v-for="(index, item) in inventory">
    {{item.key}}<button onclick="remove('{{index}}')">remove</button>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

鉴于该inventory变量是一个哈希而不是一个数组,您可以使用以下任何一个来查找它是空的并使用它v-if:

ECMA 5+:

Object.keys(inventory).length === 0
Run Code Online (Sandbox Code Playgroud)

ECMA 5之前:

function isEmpty(obj) {
    for(var prop in obj) {
        if(obj.hasOwnProperty(prop))
            return false;
    }

    return JSON.stringify(obj) === JSON.stringify({});
}
Run Code Online (Sandbox Code Playgroud)

由于您已经在使用jquery,您还可以:

jQuery.isEmptyObject({}); // true
Run Code Online (Sandbox Code Playgroud)

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="http://cdn.jsdelivr.net/vue/1.0.16/vue.js"></script>

<div id="element">

  <div v-if="isEmpty">No item in inventory</div>
  <div v-for="(index, item) in inventory">
      {{item.key}}<button @click="remove(index)">remove</button>
  </div>
</div>

<script type="text/javascript">
"use strict";
var vm;
$(function() {
    vm = new Vue({
        el: '#element',
        data: {
            inventory: {"id1" : {"key" : "val1"}, "id2" : {"key" : "val2"}},
            empty: false
        },
        methods: {
            remove: function(index) {
                Vue.delete(this.inventory, index);
                
            }
        },
        computed: {
           isEmpty: function () {
              return jQuery.isEmptyObject(this.inventory)
           }
       }
    });
});
</script>
Run Code Online (Sandbox Code Playgroud)

  • 这不起作用。库存不是数组,它是一个对象,并且对象没有“.length”属性。 (3认同)
  • 在你的第一个例子中,应该是`v-if="!inventory.length"`(如果没有任何长度) (3认同)
  • Object.keys(yourObject).length === 0这确实有效! (2认同)

Tre*_*rop 7

如果它是一个数组,你可以使用

v-if="!array.length"
Run Code Online (Sandbox Code Playgroud)


小智 6

搜索了几分钟后,我想出了一个更好的解决方案来检查对象是否为空。

Object.keys( YOUR_OBJECT ).length == 0 // Check if it's empty.
Run Code Online (Sandbox Code Playgroud)

如果为空,它将返回0。如果您想检查数组是否为空,您绝对可以使用下面的解决方案,

YOUR_ARRAY.length == 0  // Check if it's empty.
Run Code Online (Sandbox Code Playgroud)

就我而言,它是一个object,而不是array。因此,它也可能有所帮助。快乐编码:)