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>

还有比这更好的解决方案吗?

原文由 Finch_Powers 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 748
2 个回答

您可以在 inventory 中使用 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 v-on:click="remove(index)">remove</button>
  </div>
</div>

鉴于 inventory 变量是一个散列而不是一个数组,您可以使用以下任何方法来查找它为空并在 v-if 中使用它:

ECMA 5+

 Object.keys(inventory).length === 0

前 ECMA 5:

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

    return JSON.stringify(obj) === JSON.stringify({});
}

由于您已经在使用 jquery ,您还可以执行以下操作:

 jQuery.isEmptyObject({}); // true

 <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>

原文由 Saurabh 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

 Object.keys( YOUR_OBJECT ).length == 0 // Check if it's empty.

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

 YOUR_ARRAY.length == 0  // Check if it's empty.

在我的情况下,它是一个 对象,而不是 数组。因此,它也可能有所帮助。快乐编码:)

原文由 Mr Talha 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏