深入理解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 相关文章推荐
JS 事件绑定函数代码
Apr 28 Javascript
使用jQuery.fn自定义jQuery翻页插件
Jan 20 Javascript
浅谈javascript中createElement事件
Dec 05 Javascript
AngularJs  Understanding Angular Templates
Sep 02 Javascript
探讨跨域请求资源的几种方式(总结)
Dec 02 Javascript
微信小程序开发(二)图片上传+服务端接收详解
Jan 11 Javascript
js实现九宫格的随机颜色跳转
Feb 19 Javascript
angular实现图片懒加载实例代码
Jun 08 Javascript
angular.js4使用 RxJS 处理多个 Http 请求
Sep 23 Javascript
Vue.js添加组件操作示例
Jun 13 Javascript
详解Vue webapp项目通过HBulider打包原生APP(vue+webpack+HBulider)
Feb 02 Javascript
js实现点击图片在屏幕中间弹出放大效果
Sep 11 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 中dirname(_file_)讲解
2007/03/18 PHP
PHP 小心urldecode引发的SQL注入漏洞
2011/10/27 PHP
PHP里的$_GET数组介绍
2019/03/22 PHP
JavaScript的目的分析
2007/01/05 Javascript
用CSS+JS实现的进度条效果效果
2007/06/05 Javascript
用户注册常用javascript代码
2009/08/29 Javascript
JS date对象的减法处理实现代码
2010/12/28 Javascript
Javascript实现动态菜单添加的实例代码
2013/07/05 Javascript
JavaScript数据库TaffyDB用法实例分析
2015/07/27 Javascript
jQuery中的ajax async同步和异步详解
2015/09/29 Javascript
JS组件Bootstrap导航条使用方法详解
2016/04/29 Javascript
Vue.js快速入门实例教程
2016/10/15 Javascript
前端主流框架vue学习笔记第二篇
2017/07/26 Javascript
JS+HTML实现的圆形可点击区域示例【3种方法】
2018/08/01 Javascript
jQuery的ztree仿windows文件新建和拖拽功能的实现代码
2018/12/05 jQuery
jQuery实现的鼠标拖动浮层功能示例【拖动div等任何标签】
2018/12/29 jQuery
react koa rematch 如何打造一套服务端渲染架子
2019/06/26 Javascript
JavaScript命令模式原理与用法实例详解
2020/03/10 Javascript
微信小程序连接服务器展示MQTT数据信息的实现
2020/07/14 Javascript
[36:33]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第二场 11.29
2020/12/02 DOTA
[01:01:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第一场 3月4日
2021/03/11 DOTA
Python实现短网址ShortUrl的Hash运算实例讲解
2015/08/10 Python
Python应用库大全总结
2018/05/30 Python
快速排序的四种python实现(推荐)
2019/04/03 Python
python图片二值化提高识别率代码实例
2019/08/24 Python
Python SSL证书验证问题解决方案
2020/01/13 Python
tensorflow从ckpt和从.pb文件读取变量的值方式
2020/05/26 Python
浅谈pytorch中的BN层的注意事项
2020/06/23 Python
Django实现内容缓存实例方法
2020/06/30 Python
FILA斐乐中国官方商城:意大利运动品牌
2017/01/25 全球购物
海量信息软件测试笔试题
2015/08/08 面试题
奥巴马获胜演讲稿
2014/05/15 职场文书
我爱我校演讲稿
2014/05/21 职场文书
检讨书1000字
2014/10/11 职场文书
创业开店,这样方式更合理
2019/08/26 职场文书
导游词之潮音寺
2019/09/26 职场文书