Vue深度监听对象与数组

这是Vue开发中肯定会遇到的一个问题,就是当我们监听一个对象或数组且数据改变时不会触发监听事件,这是因为存储问题,普通的监只能监听普通的字段,例如监a这个变量的值是否发生变化,而对象不同,普通监听对于对象来说并不是监听的a.a1的值,而是监听a这个对象中是否还有al这个变量..... 这么说可能不标准,但容易理解,下面聊聊解决方案。

不知道大家是否还记得浅克隆与深克隆,其中一种解决方案就是数组与字符串互转,没错,就是这么干,不管是对象还是数组,可以转成字符串再传给组件监听,组件中使用时再将字符串转为数组或对象,方法很简单,大家可以百度,下面用对象举例:(转换的方法也有很多种,大家具体可以百度)

字符串互转的解决方案:(对象转字符串)

const obj = {
     id: 0,
     name: '张三',
     age: 12
}
const objToStr = JSON.stringify(obj)
console.log('objToStr:', objToStr)

字符串转对象:

const str = '{"id":0,"name":"张三","age":12}'
const strToObj = JSON.parse(str)
console.log('strToObj:', strToObj)

 

上面确实是一种方案,但是监听事件自身也是有深度监听的

普通监听:

data() {
    return {
        frontPoints: 0    
    }
},
watch: {
    frontPoints(newValue, oldValue) {
        console.log(newValue)
    }
}

 

数组的监听:

data() {
    return {
        winChips: new Array(11).fill(0)   
    }
},
watch: {
  winChips: {
    handler(newValue, oldValue) {
      for (let i = 0; i < newValue.length; i++) {
        if (oldValue[i] != newValue[i]) {
          console.log(newValue)
        }
      }
    },
    deep: true
  }
}

 

对象的监听:

data() {
  return {
    bet: {
      pokerState: 53,
      pokerHistory: 'local'
    }   
    }
},
watch: {
  bet: {
    handler(newValue, oldValue) {
      console.log(newValue)
    },
    deep: true
  }
}

 

对象的具体属性:

data() {
  return {
    bet: {
      pokerState: 53,
      pokerHistory: 'local'
    }   
    }
},
computed: {
  pokerHistory() {
    return this.bet.pokerHistory
  }
},
watch: {
  pokerHistory(newValue, oldValue) {
    console.log(newValue)
  }
}

 

以上便是Vue深度监听的方法

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.duanlonglong.com/qdjy/1193.html