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

我已经有这样的设置,但它会查找任何对象中的更改,然后重新计算整个数组。我已经设法通过使用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();

【问题讨论】:

【参考方案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不生效的主要内容,如果未能解决你的问题,请参考以下文章

eclipse修改代码不生效

域名解析为什么不生效?域名解析不生效常见问题汇总

东方通部署后配置文件不生效

环境变量修改不生效

AOP切面不生效场景

技术分享 DNS解析不生效的原因及解决方法