【问题标题】:In an array of obects watched with Vue-watch, how to get index of object that was changed?在使用 Vue-watch 监视的对象数组中,如何获取已更改对象的索引?
【发布时间】:2019-04-27 11:03:24
【问题描述】:

我有一个对象数组,如下所示:

 myArray: [{
 name: "First",
 price: 10,
 rebate: 5,
 listPrice: 15,
 outcome: 0
 },{
 name: "Second",
 price: 11,
 rebate: 5,
 listPrice: 16,
 outcome: 0
}

每当同一对象中的任何其他值发生变化时,我都想重新计算outcome-值。

我已经有这样的设置,但它会查找任何对象中的更改,然后重新计算整个数组。我已经设法通过使用computedwatch 函数的组合来设置它。然而,他们观察整个数组的变化,然后重新计算数组中所有对象的结果值。

我怎样才能观察变化然后重新计算只改变了的对象

以下是我当前用于重新计算整个数组的函数(查看另一个属性),但我正在寻找的可能完全不同。

计算:

myArrayWasChanged() {
return [this.myArray.reduce((a, {vendors}) => a + vendors, 0), this.myArray.filter(item => item.discounted == false).length] 

观看:

myArrayWasChanged: {
handler: function (val, oldVal) {
this.recalculateIsVendor();

【问题讨论】:

    标签: arrays vue.js watch computed-properties


    【解决方案1】:

    鉴于outcome 完全依赖于其他属性,它实际上并不是组件状态的一部分。因此,在组件的data 中,您可以存储没有outcome 的数组,然后计算新版本的数组将结果 作为计算属性。

    data: function () {
      return {
        myArrayWithoutOutcome: [
        {
          name: "First",
          price: 10,
          rebate: 5,
          listPrice: 15
        },
        {
          name: "Second",
          price: 11,
          rebate: 5,
          listPrice: 16
        }]
      }
    },
    computed: {
      myArrayWithOutcome: function () {
        return this.myArrayWithoutOutcome.map(x => {
          return {...x, outcome: this.calculateOutcome(x)}
        })
      }
    },
    methods: {
      calculateOutcome(item) {
        // Logic to calculate outcome from item goes here
        return 0
      }
    }
    

    【讨论】:

    • 感谢您的建议,它确实有效。这不是我想象的解决方案,但我想我需要学习:-)
    • 如果我想将outcome 添加到原始数组,而不是创建一个新数组。我还能以某种方式使用这种方法吗?
    • 计算属性不应修改数据,因此您可能必须使用手表来实现这一点。这个解决方案听起来很冒险——如果可能的话,我会尽量避免将计算值放入组件数据中,因为它们太容易不同步了。
    • 感谢您的评论,是的,这是我最初向观察者提出的问题 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-22
    • 2014-05-14
    • 2022-07-16
    • 2012-02-21
    • 2017-10-23
    • 1970-01-01
    • 2020-03-17
    相关资源
    最近更新 更多