深入理解vue.js中$watch的oldvalue与newValue


Posted in Javascript onAugust 07, 2017

$watch中的oldvalue和newValue

大家都知道,在vue.js中给我们提供了$watch的方法来做对象变化的监听,而且在callback中会返回两个对象,分别是oldValue和newValue.

顾名思义,这两个对象就是对象发生变化前后的值。

但是在使用过程中我发现这两个值并不总是预期的。下面来一起看看详细的介绍:

定义data的值

data: {
 arr: [{
  name: '笨笨',
  address: '上海'
 }, {
  name: '笨笨熊',
  address: '北京'
 }],
 obj: {
  name: '呆呆',
  address: '苏州'
 },
 str: '哈哈哈'
 }

定义watch

watch: {
 arr: function(newValue, oldValue) {
  console.log(newValue, oldValue)
  console.log(JSON.stringify(oldValue) === JSON.stringify(newValue))
 },
 obj: function(newValue, oldValue) {
  console.log(newValue, oldValue)
  console.log(JSON.stringify(oldValue) === JSON.stringify(newValue))
 },
 str: function(newValue, oldValue) {
  console.log(newValue, oldValue)
  console.log(JSON.stringify(oldValue) === JSON.stringify(newValue))
 },
 }

定义事件触发

methods: {
 test() {
  this.arr.push({
  name: 9
  })
  this.$set(this.obj, 'i', 0)
  this.str = ''
 },
 test1() {
  this.arr = [{
  name: '000'
  }]
  this.obj = {
  name: 999
  }
  this.str = '123'
 }
 }

测试结果为

  1. 对数组进行push操作和对Obj进行$set操作,虽然都可能触发watch事件,但是在callback返回的结果中,oldValue和newValue相同。字符串对象如预期返回
  2. 在对数组和Obj统一进行赋值操作时,watch触发并且oldValue和newValue如预期返回

关于watch的其他测试

不能够触发监听的

1、数组

        修改某个下标的某个属性的值

        使用原生delete删除某个属性

        对某个下标新增一个属性(不使用$set)

        对某个下标重新赋值

2、对象

        修改某个属性的值(但是会触发这个属性的监听)

        新增一个属性(不使用$set)

        原生delete删除某个属性

以上总结可能存在不足

万金油实现watch监听

在修改完数据后添加这样一段代码

array

arr = [...arr]

obj

obj = {...obj}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
Javascript实现仿WebQQ界面的“浮云”兼容 IE7以上版本及FF
Apr 27 Javascript
『JavaScript』限制Input只能输入数字实现思路及代码
Apr 22 Javascript
使用node.js 制作网站前台后台
Nov 13 Javascript
JS实现左右拖动改变内容显示区域大小的方法
Oct 13 Javascript
vue实现可增删查改的成绩单
Oct 27 Javascript
微信小程序 POST请求(网络请求)详解及实例代码
Nov 16 Javascript
JavaScript的for循环中嵌套一个点击事件的问题解决
Mar 03 Javascript
vue中如何引入jQuery和Bootstrap
Apr 10 jQuery
微信小程序实现搜索指定景点周边美食、酒店
May 18 Javascript
js实现登录拖拽窗口
Feb 10 Javascript
微信小程序吸底区域适配iPhoneX的实现
Apr 09 Javascript
如何在微信小程序中使用骨架屏的步骤
Jun 12 Javascript
JavaScript调试之console.log调试的一个小技巧分享
Aug 07 #Javascript
react native仿微信PopupWindow效果的实例代码
Aug 07 #Javascript
jquery+css实现简单的图片轮播效果
Aug 07 #jQuery
bootstrap table表格客户端分页实例
Aug 07 #Javascript
基于JS递归函数细化认识及实用实例(推荐)
Aug 07 #Javascript
react native实现往服务器上传网络图片的实例
Aug 07 #Javascript
使用Node.js实现简易MVC框架的方法
Aug 07 #Javascript
You might like
PHP实现格式化文件数据大小显示的方法
2015/01/03 PHP
php关闭warning问题的解决方法
2016/05/17 PHP
Laravel5.1自定义500错误页面示例
2016/10/09 PHP
关于图片验证码设计的思考
2007/01/29 Javascript
JavaScript 获取任一float型小数点后两位的小数
2014/06/30 Javascript
jQuery拖拽插件gridster使用指南
2015/04/21 Javascript
JS实现可拖曳、可关闭的弹窗效果
2015/09/26 Javascript
分离与继承的思想实现图片上传后的预览功能:ImageUploadView
2016/04/07 Javascript
详解JavaScript设计模式开发中的桥接模式使用
2016/05/18 Javascript
Bootstrap3使用typeahead插件实现自动补全功能
2016/07/07 Javascript
微信小程序 swiper组件详解及实例代码
2016/10/25 Javascript
JS实现根据用户输入分钟进行倒计时功能
2016/11/14 Javascript
JavaScript实现经典排序算法之冒泡排序
2016/12/28 Javascript
图片懒加载插件实例分享(含解析)
2017/01/09 Javascript
node.js与C语言 实现遍历文件夹下最大的文件,并输出路径,大小
2017/01/20 Javascript
原生js实现可拖动的登录框效果
2017/01/21 Javascript
Vue 单文件中的数据传递示例
2017/03/21 Javascript
react native与webview通信的示例代码
2017/09/25 Javascript
vue 弹框产生的滚动穿透问题的解决
2018/09/21 Javascript
使用electron实现百度网盘悬浮窗口功能的示例代码
2018/10/24 Javascript
详解webpack引入第三方库的方式以及注意事项
2019/01/15 Javascript
解决Layui数据表格的宽高问题
2019/09/28 Javascript
vue在响应头response中获取自定义headers操作
2020/07/24 Javascript
Vue使用axios引起的后台session不同操作
2020/08/14 Javascript
[27:53]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS iG
2014/05/26 DOTA
Python内置的字符串处理函数详细整理(覆盖日常所用)
2014/08/19 Python
Python:Scrapy框架中Item Pipeline组件使用详解
2017/12/27 Python
python 调用pyautogui 实时获取鼠标的位置、移动鼠标的方法
2019/08/27 Python
神路信息Java面试题目
2013/03/31 面试题
Laravel中Kafka的使用详解
2021/03/24 PHP
大学校园生活自我鉴定
2014/01/13 职场文书
国培计划培训感言
2014/03/11 职场文书
《富饶的西沙群岛》教学反思
2014/04/09 职场文书
父母对孩子说的话
2014/04/12 职场文书
行政执法队伍作风整顿剖析材料
2014/10/11 职场文书
房贷工资证明范本
2015/06/12 职场文书