这是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深度监听的方法
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!