这是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深度监听的方法