解决Vue 使用Watch侦听器监听对象如何取得旧值问题

解决Vue 使用Watch侦听器监听对象如何取得旧值问题

Created by @一个前端er 2020/08/25

最近在项目中因为需要深度监听数组对象的变化,其实是一组表格数据,数组中的每一项都是一个对象,或者说都是一行数据,监听它的改变就必须使用Watch侦听器来完成了,并且由于对象(数组)不止一层引用,需要在Watch中开始深度监听deep:true,基本语法如下:

watch:{
   
  someVal:{
   
  handler(newVal,oldVal){
   
  //处理逻辑
  console.log(newVal.oldVal)
  },
   deep:true
 }
}

当数据改变之,确实是执行了handler里面的代码,但是在控制台查看新值和老值,发现它们两都是改变之后的数据,这就让我有点纳闷了,以为是哪里出现问题了,然后我就判断了它们两是不是同一个对象:

console.log(newVal === oldVal) //true

结果返回的是true,果然它们两指向的是同一个引用,这说明 Watch 只是侦听到它改变了,并没有把之前的老值给缓存下来,引用类型直接指向了引用地址。后来在网上搜了一下解决方案,基本都是类似的:使用Computed计算属性缓存 深拷贝后的 dataprops 里面的数据,然后再使用watch进行侦听,这样前前后后指向的是不同的两个对象,从而获得改变之前的旧数:

computed:{
   
 cacheSomeVal(){
   
 return deepClone(this.someVal) //JSON.parse(JSON.stringify(this.someVal)
 }
},
watch:{
   
  cacheSomeVal:{
   
  handler(newVal,oldVal){
   
  //处理逻辑
  console.log(newVal.oldVal)
  },
   deep:true
 
  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue中的watch是一个侦听器,用于监听数据的变化,并在数据变化时执行相应的操作。通过watch,我们可以监听某个数据的变化,并在数据变化时执行一些特定的逻辑,例如发送网络请求、更新UI等。 watch的语法如下: ```javascript watch: { // 监听的数据 someData: function (newValue, oldValue) { // 在数据变化时执行的操作 // newValue为新值,oldValue为旧值 } } ``` 可以通过watch监听单个数据的变化,也可以监听多个数据的变化: ```javascript watch: { // 监听单个数据的变化 someData: function (newValue, oldValue) { // 在数据变化时执行的操作 }, // 监听多个数据的变化 anotherData: function (newValue, oldValue) { // 在数据变化时执行的操作 } } ``` watch还可以使用深度监听监听对象或数组中的属性变化: ```javascript watch: { // 监听对象中某个属性的变化 'obj.prop': function (newValue, oldValue) { // 在属性变化时执行的操作 }, // 监听数组中某个元素的变化 'arr.0': function (newValue, oldValue) { // 在元素变化时执行的操作 } } ``` 除了监听数据的变化,watch还可以监听路由参数的变化: ```javascript watch: { // 监听路由参数的变化 $route: function (to, from) { // 在路由参数变化时执行的操作 } } ``` 总之,watchVue中非常重要的一个功能,它可以帮助我们监听数据、路由参数等的变化,并在变化时执行相应的操作,从而实现更加复杂的应用逻辑。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值