【问题标题】:Vue- How to watch the properties inside array of objectsVue-如何查看对象数组中的属性
【发布时间】:2018-12-03 17:41:39
【问题描述】:

我有一个这样的 JSON

'criteria': [
 {
  'row': {
    'name': '1',
    'values': [{}]
  }
 },
 {
  'row': {
    'name': '2',
    'values': [{}]
  }
 }
]

我试过了

watch: {
 criteria: {
   deep: true,
   handler () {
    console.log(this.criteria)
   }
  }
}

但它正在关注标准的每一次变化。我怎样才能只看价值观?有什么方法可以编写自定义函数并返回我想以角度观看的内容吗?

更新:

我也试过了

computed: {
test () {
  var values = []
  _.forEach(this.criteria, function (criteria) {
    _.forEach(criteria.row, function (row) {
      values.push(row.values)
    })
  })
  return values
}
},
watch: {
  test () {
   console.log("changed")
  }
}

还在看每一件事。

【问题讨论】:

    标签: javascript vue.js


    【解决方案1】:

    你需要观察criteria数组,并在watch处理函数中检测变化的项目。

    data: {
        criteria: [
            {
                'row': {
                    'name': '1',
                    'values': [{}]
                }
            },
            {
                'row': {
                    'name': '2',
                    'values': [{}]
                }
            }
        ],
        oldCriteria: []
    },
    methods: {
        setCriteriaValue() {
            // deep clone
            this.oldCriteria = JSON.parse(JSON.stringify(this.criteria))
        },
    },
    mounted() {
    
        // TEST: isChange = FALSE
        setTimeout(() => {
            this.criteria[1].row.name = "new name"
        }, 2000);
    
        // TEST: isChange = TRUE
        setTimeout(() => {
            this.criteria[1].row.values = [10, 20]
        }, 4000);
    },
    watch: {
        "criteria": {
            deep: true,
            handler: function (after) {
                console.log("criteria watched")
    
                var vm = this;
                let isChanged = false;
    
                for (let index = 0; index < after.length; index++) {
    
                    const item = after[index].row
                    const props = Object.keys(item)
    
                    isChanged = props.some(function(prop) {
                        if (prop === "values") {
                            const newValue = item[prop]
                            const oldValue = vm.$data.oldCriteria[index].row[prop]
    
                            return JSON.stringify(newValue) !== JSON.stringify(oldValue);
                        }
    
                        return false
                    })
                }
    
                if (isChanged) {
                    alert("CHANGED!")
    
                    // Do your stuff here
                    // ...
                }
    
                // Update the old value
                vm.setCriteriaValue();
                console.log("isChanged = ", isChanged)
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      只需观看criterialength

      喜欢你的用例:

      watch: {
       'criteria.length': {
         handler () {
          console.log(this.criteria)
         }
        }
      }
      

      这是完整的 API:

      https://vuejs.org/v2/api/#watch

      你可以看任何东西。

      技巧:制作计算道具并观看计算道具。

      【讨论】:

      • 嘿,我想在条件->行->“值”中观看“值”属性。
      • 我更新了我的问题,我尝试使用计算。我做错了什么?
      • @Sam 你的test 计算取决于this.criteria 和每个row 中的每个criteria,因此将在每次更改时重新计算。这就是 Vue 的依赖跟踪的工作原理。您现在可以做的是检查您的观察者的oldValuenewValue,并且只有在两者不同时才执行操作。
      猜你喜欢
      • 2019-02-16
      • 2019-04-20
      • 1970-01-01
      • 2018-01-03
      • 2019-11-20
      • 2011-08-11
      • 2017-11-03
      • 2021-12-27
      • 1970-01-01
      相关资源
      最近更新 更多