vue3watch不生效
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue3watch不生效相关的知识,希望对你有一定的参考价值。
参考技术A 设置deep:true,这样obj中的属性发生变化(可被监测到的),便会执行 handler 函数;。
!!!注意,因为是引用类型,所以newValue 和oldValue始终相等,千万不要犯傻的写相等就return,那就永远也不往下走了。。。。
在使用 Vue-watch 监视的对象数组中,如何获取已更改对象的索引?
【中文标题】在使用 Vue-watch 监视的对象数组中,如何获取已更改对象的索引?【英文标题】:In an array of obects watched with Vue-watch, how to get index of object that was changed? 【发布时间】: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
-值。
我已经有这样的设置,但它会查找任何对象中的更改,然后重新计算整个数组。我已经设法通过使用computed
和watch
函数的组合来设置它。然而,他们观察整个数组的变化,然后重新计算数组中所有对象的结果值。
我怎样才能观察变化然后重新计算只改变了的对象?
以下是我当前用于重新计算整个数组的函数(查看另一个属性),但我正在寻找的可能完全不同。
计算:
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();
【问题讨论】:
【参考方案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
添加到原始数组,而不是创建一个新数组。我还能以某种方式使用这种方法吗?
计算属性不应修改数据,因此您可能必须使用手表来实现这一点。这个解决方案听起来很冒险——如果可能的话,我会尽量避免将计算值放入组件数据中,因为它们太容易不同步了。
感谢您的评论,是的,这是我最初向观察者提出的问题 :-)以上是关于vue3watch不生效的主要内容,如果未能解决你的问题,请参考以下文章