其他分享
首页 > 其他分享> > Vue:用观察者对象自动填充空数组

Vue:用观察者对象自动填充空数组

作者:互联网

我正在尝试在数据中初始化一个空数组,然后从服务器获取一个JSON并填充它.

问题是数组总是有一个额外的Observer对象,所以当我记录它时,我看到了:

empty items array: [ob: Observer]

这是一段代码摘录:

data() {
        return {
            items: []
        }
    },
 created() {
         this.$http.get('/api/menus').then(function (response) {

            console.log('items before', this.items); //THIS LOGS items before: [__ob__: Observer]
             this.items = [].concat(response.body);
            this.items.forEach(function (item) {
              console.log('item', item);

              item.$add('active', false);

              item.tests.forEach(function (test) {
                  test.$add('active', false);
              });
        });

         }).catch(function (err) {
             console.error('err', err);

         });

     },

问题是,当尝试向数组中的对象添加新属性时出现错误:

err TypeError: item.$add is not a function

当我调试时,我看到它发生是因为它把观察者对象视为数组的一部分.

正常吗我应该只检查$add是否存在?在视图中渲染时,Vue会忽略此对象吗?

解决方法:

根据您的代码,您想要将items对象中的active属性设置为false.您还希望将每个项目的tests属性中所有活动的属性设置为false.

Vue.js是反应性的,可以自动检测更改,但仅针对对象本身,而不是其属性.对于数组,vue将仅通过这些方法检测更改(有关vue.js https://vuejs.org/v2/guide/list.html#ad中的列表呈现的更多信息):

> push()
> pop()
> shift()
> unshift()
> splice()
> sort()
>反向()

但是属性呢?您可以在任何Vue实例中使用Vue.set(object,property,value)或this.$set强制vue查看数组或对象深处的变化.

因此,在您的示例中,您可以这样实现:

this.items.forEach(function (item, key) {
    console.log('item', item);

    this.$set(this.items[key], 'active', false);

    item.tests.forEach(function (test, testKey) {
        this.$set(this.items[key].tests[testKey], 'active', false);
    }, this);
}, this);

它应该工作.这是工作示例:http://jsbin.com/cegafiqeyi/edit?html,js,output(使用了某些ES6功能,请不要混淆)

标签:vue-js,vuejs2,javascript
来源: https://codeday.me/bug/20191026/1934124.html