深入理解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的Repeater实现代码
Jul 17 Javascript
javascript跨域刷新实现代码
Jan 01 Javascript
js二维数组排序的简单示例代码
Jan 24 Javascript
深入理解javascript原型链和继承
Sep 23 Javascript
jQuery中wrapAll()方法用法实例
Jan 16 Javascript
在JavaScript中用getMinutes()方法返回指定的分时刻
Jun 10 Javascript
简单理解vue中el、template、replace元素
Oct 27 Javascript
微信小程序动态添加分享数据
Jun 14 Javascript
基于Two.js实现星球环绕动画效果的示例
Nov 06 Javascript
jquery ajaxfileupload异步上传插件
Nov 21 jQuery
Vue实现web分页组件详解
Nov 28 Javascript
利用js-cookie实现前端设置缓存数据定时失效
Jun 18 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与SQL注入攻击[二]
2007/04/17 PHP
在mysql数据库原有字段后增加新内容
2009/11/26 PHP
PHP 页面编码声明方法详解(header或meta)
2010/03/12 PHP
PHP实现文件上传与下载
2020/08/28 PHP
jquery控制listbox中项的移动并排序的实现代码
2010/09/28 Javascript
jquery弹出关闭遮罩层实例
2013/08/06 Javascript
json的定义、标准格式及json字符串检验
2014/05/11 Javascript
javascript判断是否按回车键并解决浏览器之间的差异
2014/05/13 Javascript
RequireJS简易绘图程序开发
2016/10/28 Javascript
HTML5实现微信拍摄上传照片功能
2017/04/21 Javascript
详解AngularJS 路由 resolve用法
2017/04/24 Javascript
Ionic + Angular.js实现验证码倒计时功能的方法
2017/06/12 Javascript
React + webpack 环境配置的方法步骤
2017/09/07 Javascript
spring+angular实现导出excel的实现代码
2019/02/27 Javascript
vue组件开发之tab切换组件使用详解
2020/08/21 Javascript
python中OrderedDict的使用方法详解
2017/05/05 Python
Python虚拟环境virtualenv的安装与使用详解
2017/05/28 Python
python基础教程项目二之画幅好画
2018/04/02 Python
在python中对变量判断是否为None的三种方法总结
2019/01/23 Python
python基于itchat模块实现微信防撤回
2019/04/29 Python
python如何以表格形式打印输出的方法示例
2019/06/21 Python
pytorch 实现将自己的图片数据处理成可以训练的图片类型
2020/01/08 Python
升级keras解决load_weights()中的未定义skip_mismatch关键字问题
2020/06/12 Python
Windows 平台做 Python 开发的最佳组合(推荐)
2020/07/27 Python
CSS3制作炫酷带方向感应的鼠标滑过图片3D动画
2016/03/16 HTML / CSS
Agoda台湾官网:国内外订房2折起
2018/03/20 全球购物
Contém1g官网:巴西彩妆品牌
2020/01/17 全球购物
sort命令的作用和用法
2012/11/04 面试题
汽车装潢店创业计划书范文
2014/02/05 职场文书
环保倡议书500字
2014/05/15 职场文书
清正廉洁演讲稿
2014/05/22 职场文书
党员干部反四风对照检查材料思想汇报
2014/09/14 职场文书
2015年幼儿教育工作总结
2015/07/24 职场文书
《葡萄沟》教学反思
2016/02/23 职场文书
Java 超详细讲解设计模式之中的抽象工厂模式
2022/03/25 Java/Android
SQL Server中T-SQL标识符介绍与无排序生成序号的方法
2022/05/25 SQL Server