深入理解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 相关文章推荐
基于JQuery制作的产品广告效果
Dec 08 Javascript
JavaScript判断浏览器类型的方法
Feb 10 Javascript
JS通过ajax动态读取xml文件内容的方法
Mar 24 Javascript
JavaScript获取网页表单提交方式的方法
Apr 02 Javascript
BootStrap使用popover插件实现鼠标经过显示并保持显示框
Jun 23 Javascript
jQuery的ajax下载blob文件
Jul 21 Javascript
jquery动态创建div与input的实例代码
Oct 12 Javascript
详解Javascript 中的 class、构造函数、工厂函数
Dec 20 Javascript
vue配置请求本地json数据的方法
Apr 11 Javascript
vue移动端使用appClound拉起支付宝支付的实现方法
Nov 21 Javascript
vue绑定数字类型 value为数字的实例
Aug 31 Javascript
利用 JavaScript 实现并发控制的示例代码
Dec 31 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
一个程序下载的管理程序(三)
2006/10/09 PHP
php for 循环语句使用方法详细说明
2010/05/09 PHP
php缩放gif和png图透明背景变成黑色的解决方法
2014/10/14 PHP
PHP中的Trait 特性及作用
2016/04/03 PHP
php基于闭包实现函数的自调用(递归)实例分析
2016/11/11 PHP
laravel 实现划分admin和home 模块分组
2019/10/15 PHP
js实现C#的StringBuilder效果完整实例
2015/12/22 Javascript
基于canvas实现的绚丽圆圈效果完整实例
2016/01/26 Javascript
BootStrap的Datepicker控件使用心得分享
2016/05/25 Javascript
js给table赋值的实例代码
2016/10/13 Javascript
jquery封装插件时匿名函数形参和实参的写法解释
2017/02/14 Javascript
JS+php后台实现文件上传功能详解
2019/03/02 Javascript
JavaScript函数定义方法实例详解
2019/03/05 Javascript
说说如何使用Vuex进行状态管理(小结)
2019/04/14 Javascript
微信公众号平台接口开发 获取微信服务器IP地址方法解析
2019/08/14 Javascript
python有证书的加密解密实现方法
2014/11/19 Python
python的random模块及加权随机算法的python实现方法
2017/01/04 Python
完美解决python中ndarray 默认用科学计数法显示的问题
2018/07/14 Python
详解python编译器和解释器的区别
2019/06/24 Python
pandas 使用均值填充缺失值列的小技巧分享
2019/07/04 Python
numpy数组做图片拼接的实现(concatenate、vstack、hstack)
2019/11/08 Python
python pygame实现挡板弹球游戏
2019/11/25 Python
Python反爬虫伪装浏览器进行爬虫
2020/02/28 Python
Python 分布式缓存之Reids数据类型操作详解
2020/06/24 Python
Python collections模块的使用方法
2020/10/09 Python
英国网上香水店:Fragrance Direct
2016/07/20 全球购物
Booking.com荷兰:全球酒店网上预订
2017/08/22 全球购物
ghd法国官方网站:英国最受欢迎的美发工具品牌
2019/04/18 全球购物
linux面试题参考答案(4)
2013/01/28 面试题
高一新生军训感言
2014/03/02 职场文书
父母对孩子说的话
2014/04/12 职场文书
小学生教师节演讲稿
2014/09/03 职场文书
安徽导游词
2015/02/12 职场文书
Python Parser的用法
2021/05/12 Python
使用Oracle跟踪文件的问题详解
2021/06/28 Oracle
Python+pyaudio实现音频控制示例详解
2022/07/23 Python