vue用watch监听对象,打印oldValue和newValue相同的问题

背景

做节目设计器时候,当组件超出限制大小时,需要回滚此次操作,但是数据没有备份,拿不到旧数据。因此在watch中监听变化对象,达到旧数据缓存的能力。

data(){return {obj:{a:1,b:2,c:{d:3,e:4}},oldObj:null}
},
watch: {obj: {handler: function (newVal, oldVal) {console.log('newVal', newVal, 'oldVal', oldVal)this.oldObj = this.obj},deep: true}
}

设想是这样,可是当我们实践发现,newVal,和oldVal打印值相同,这是为什么呢?

原理

其实很简单,因为对象指向的是一个对象,对象是引用类型。所以在改了数据之后,oldVal也会随之变化。

Vue官方的解释是:在变更(不是替换)对象或数组时,新值与旧值相同,因为他们指向同一数组或对象,Vue不会保留变更前值的副本。

解决方法

我们可以用计算属性并配合JSON.stringify()来进行保存。
修改后代码:

computed: {computedObj () {return JSON.parse(JSON.stringify(this.obj))}
}
watch: {computedObj: {handler: function (newVal, oldVal) {console.log('newVal', newVal)console.log('oldVal', oldVal)this.oldObj = oldVal},deep: true}}

这样就实现了我们想要的效果。缓存了旧数据。如果需要回滚操作,只需要赋值缓存数据即可。

同样使用场景还可以是:我们需要监听多个字段时,就可以把它们放到一个对象中。然后去监听这个对象。

附加

如果是第二种场景想节省性能的话,可以加一个防抖函数进去,防止页面初始化被调用多次。watch监听虽好,但还是少用、小心用为妙啊!

搞定,下班!

vue用watch监听对象,打印oldValue和newValue相同的问题相关推荐

  1. vue watch监听对象

    一.watch的API vm.$watch( expOrFn, callback, [options] ) 参数: {string | Function} expOrFn {Function | Ob ...

  2. vue 对象中数组中对象某个属性更改_vue之监听对象、对象数组的改变

    vue之监听对象的改变 一.对象监听 1. 深度监听 change name:'test', data () {return{ user: { id:1, name: '李四', age: 14, s ...

  3. [vue] watch怎么深度监听对象变化

    [vue] watch怎么深度监听对象变化 deep设置为true 就可以监听到对象的变化let vm=new Vue({el:"#first",data:{msg:{name:' ...

  4. VUE 2 无法监听数组和对象的某些变化

    一.数组 1.  不能监听的情况 (1) 直接通过下标赋值  arr[i] = value (2) 直接修改数组长度 arr.length = newLen 2.  替代做法 (1)修改值 1. Vu ...

  5. vue 监听对象里的特定数据

    2019独角兽企业重金招聘Python工程师标准>>> vue  监听对象里的特定数据变化 通常是这样写的,只能监听某一个特定数据 watch: {params: function( ...

  6. vue监听对象某一个属性

    watch: {uploadObj: {//监听对象deep: true,handler: function(value) {if (!value.receiver && !value ...

  7. Vue.js开发记录--用watch监听对象中属性的变化

    监听对象中所有属性 存在对象obj,若想要监听其中所有的值的变化 watch: {obj: {handler (val) {// coding},deep: true}, } 监听对象中某个属性 如果 ...

  8. 动态数据绑定之监听对象变化

    ---恢复内容开始--- 动态数据绑定是MVVM框架中最基础的的一个功能,简单描述就是:将数据和视图进行绑定,当数据发生改变时,视图随之改变,更深层次一点,数据绑定包括单向数据绑定和双向数据绑定. 本 ...

  9. watch监听对象里面值的变化_Vue总结——computed和watch的用法和区别

    computed--计算属性 写法一: 写法二: computed默认有缓存 如果被依赖的属性没有发生变化,就不会重新计算. 什么是变化: 点击n+1按钮,控制台打出 n变了 点击obj.a=hi , ...

最新文章

  1. 数据库密码爆破HexorBase
  2. Keepalived — VRRP 的 Linux 软件实现
  3. 【ngx-ueditor】百度编辑器按下Shift键不触发contentChange事件
  4. 【原创】MySQL 返回更新值(RETURNING)
  5. hdu 1241Oil Deposits(BFS)
  6. 精准设计类素材方向,搜索把握细节
  7. python scrapy 基本操作演示代码
  8. [渝粤教育] 广东-国家-开放大学 21秋期末考试物权法10774k1
  9. Liferay的架构:缓存(第一部分)
  10. boost升压电路原理
  11. 项目管理与敏捷开发-流程之间的区别
  12. [轻笔记]Juliav0.6配置jupyter
  13. mysql数据库热备_Mysql 数据库双机热备的配置
  14. 2017/11/6~2017/11/12学习Java总结
  15. 算法设计-递归法解最长公共子序列问题 C代码
  16. 4.6 Heuristics for Backtracking Algorithms回溯算法的启发式
  17. 【算法研究】 AEC 回音消除算法
  18. DIV+CSS实现圆角边框
  19. 软件工程-------学生食堂管理的数据流图
  20. 某盘提速下载工具Proxyee-down快速下载大文件

热门文章

  1. [CVPR 2017] Matrix Tri-Factorization with Manifold Regularization for Zero-shot Learning
  2. Latex 三线表 横线竖线短横线
  3. Windows 10无法打开注册表 由于某个错误无法打开该密钥(详细信息:拒绝访问)且无法在注册表上设置新的所有者拒绝访问的解决方案
  4. 2017云栖大会参会体验
  5. 阿里云本地上传文件夹内所有内容代码
  6. 国外优秀软件测试网站介绍及测试资料
  7. 【电商】电商后台设计—优惠券
  8. 2023年外贸行业面临的现状
  9. 米哈游2020春招笔试题总结
  10. 剪绳子(动规、数论、贪心)