当前位置:   article > 正文

用watch兼听对象时,oldValue与newValue值相同的问题_watch监听对象,newval和oldval一样

watch监听对象,newval和oldval一样

项目场景:

需要监听多个字段的变化时,一个一个去监听很麻烦,所以把他们搞成一个对象的属性,然后去监听这个对象。


问题描述

然而我在监听中去输出newVal,和oldVal时,发现值相同

  1. watch: {
  2. priceForm: {
  3. handler: function (newVal, oldVal) {
  4. console.log('newVal', newVal, 'oldVal', oldVal)
  5. this.getPrice()
  6. },
  7. deep: true
  8. }
  9. }

原因分析:

Vue官方的解释是:在变更(不是替换)对象或数组时,新值与旧值相同,因为他们指向同一数组或对象,Vue不会保留变更前值的副本。


解决方案:

所以我们这里利用计算属性来使其保留

  1. watch: {
  2. priceFormData: {
  3. handler: function (newVal, oldVal) {
  4. console.log('newVal', newVal)
  5. console.log('oldVal', oldVal)
  6. this.getPrice()
  7. },
  8. deep: true
  9. }
  10. },
  11. computed: {
  12. priceFormData () {
  13. return JSON.parse(JSON.stringify(this.priceForm))
  14. }
  15. }

问题描述:

这样修改以后oldVal与newVal值相同的问题已经可以了,然而因为我初始化的时候会给对象中的所有属性都赋值,这样就会执行很多次,但是我的初衷其实是初始化时只执行一次,其它时候发生改变时再去监听

解决方案

利用timeout延迟执行去实现初始化

  1. watch: {
  2. priceFormData: {
  3. handler: function (newVal, oldVal) {
  4. if (this.timer) {
  5. clearTimeout(this.timer)
  6. }
  7. this.timer = setTimeout(() => {
  8. this.getPrice()
  9. }, 1000)
  10. },
  11. deep: true
  12. }
  13. },
  14. computed: {
  15. priceFormData () {
  16. return JSON.parse(JSON.stringify(this.priceForm))
  17. }
  18. }

 biingo => 所有的问题都已解决

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/113221
推荐阅读