深入理解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 相关文章推荐
google地图的路线实现代码
Aug 20 Javascript
CSS+Jquery实现页面圆角框方法大全
Dec 24 Javascript
js加减乘除丢失精度问题解决方法
May 16 Javascript
JavaScript实现自动对页面上敏感词进行屏蔽的方法
Jul 27 Javascript
JavaScript中点击事件的写法
Jun 28 Javascript
微信开发 微信授权详解
Oct 21 Javascript
5分钟打造简易高效的webpack常用配置
Jul 04 Javascript
通过js动态创建标签,并设置属性方法
Feb 24 Javascript
vue源码学习之Object.defineProperty 对数组监听
May 30 Javascript
vue.draggable实现表格拖拽排序效果
Dec 01 Javascript
js实现圆形菜单选择器
Dec 03 Javascript
canvas多重阴影发光效果实现
Apr 20 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
Laravel框架中实现使用阿里云ACE缓存服务
2015/02/10 PHP
PHP中header用法小结
2016/05/23 PHP
PHP+MySql实现一个简单的留言板
2020/07/19 PHP
通用javascript脚本函数库 方便开发
2009/10/13 Javascript
js关闭当前页面(窗口)的几种方式总结
2013/03/05 Javascript
实现无刷新联动例子汇总
2015/05/20 Javascript
jQuery取消ajax请求的方法
2015/06/09 Javascript
javascript随机抽取0-100之间不重复的10个数
2016/02/25 Javascript
JavaScript开发者必备的10个Sublime Text插件
2016/02/27 Javascript
JavaScript实现阿拉伯数字和中文数字互相转换
2016/06/12 Javascript
jquery实现静态搜索功能(可输入搜索文字)
2017/03/28 jQuery
JavaScript之生成器_动力节点Java学院整理
2017/06/30 Javascript
AngularJS中重新加载当前路由页面的方法
2018/03/09 Javascript
原生JS实现轮播图效果
2018/10/12 Javascript
vue实现多组关键词对应高亮显示功能
2019/07/25 Javascript
解决Vue调用springboot接口403跨域问题
2019/09/02 Javascript
浅谈layui 表单元素的选中问题
2019/10/25 Javascript
浅谈JavaScript节流和防抖函数
2020/08/25 Javascript
vue 使用原生组件上传图片的实例
2020/09/08 Javascript
Python实现约瑟夫环问题的方法
2016/05/03 Python
使用python 和 lint 删除项目无用资源的方法
2017/12/20 Python
parser.add_argument中的action使用
2020/04/20 Python
Python使用re模块验证危险字符
2020/05/21 Python
Python数据可视化实现漏斗图过程图解
2020/07/20 Python
浅析HTML5中的download属性使用
2019/03/13 HTML / CSS
Argos官网:英国家喻户晓的百货零售连锁商
2017/04/03 全球购物
白兰氏健康Mall:BRAND’S
2017/11/13 全球购物
世界上最大的家庭自动化公司:Smarthome
2017/12/20 全球购物
安全生产责任书
2014/03/12 职场文书
供用电专业求职信
2014/07/07 职场文书
2014年计生工作总结
2014/11/21 职场文书
开除员工通知
2015/04/22 职场文书
2015年感恩父亲节活动策划方案
2015/05/05 职场文书
小学数学新课改心得体会
2016/01/22 职场文书
2016护理专业求职自荐书
2016/01/28 职场文书
《曹冲称象》教学反思
2016/02/20 职场文书