vue深度监听对象newVal和oldVal一样怎么回事

有时候我们使用watch并且添加deep:true深度监听一个对象时候,获取到的newVal和oldVal数据一致,官方一点这种现象叫做:深度监听对象出现的同源问题

其实道理很简单,属于vue2.0的坑,其实就是:在变异 (不是替换) 对象或数组时,旧值将与新值相同,因为它们的引用指向同一个对象/数组。Vue 不会保留变异之前值的副本;

大意就是:在打印数组或是对象的时候是通过引用去取的值,当你改变数组时,打印出来的值自然也就变了

watch: {
	obj: {
		handler (newVal, oldVal) {
			// newVal和oldVal打印的话是一样的,指针相同
		},
		deep: true
	}
}

如果你确实需要获取newVal和oldVal,建议使用computed来解决,并且我们知道在computed中是无法获取this的,想要获取可以使用

import Vue from 'vue'
// mounted中添加
Vue.prototype.$t = this
//然后在computed中直接使用
let that = Vue.prototype.$t
// 先用JSON方法在computed属性中对 this.obj 深拷贝
computed: {
   obj() {
   		// 就是当前组件的this
   		console.log(Vue.prototype.$t) 
        return JSON.parse(JSON.stringify(this.obj))
    }
}
 //再监听computed属性中以已经深拷贝过的的 this.obj 
 watch: {
    obj: {   //再监听computed属性中以已经深拷贝过的的 this.obj 
        handler(newVal, oldVal) {
            console.log(newVal)
            console.log(oldVal)
        },
    }

}
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值