深入理解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的with语句使用方法
Sep 21 Javascript
jQuery 借助插件Lavalamp实现导航条动态美化效果
Sep 27 Javascript
简单的两种Extjs formpanel加载数据的方式
Nov 09 Javascript
eclipse导入jquery包后报错的解决方法
Feb 17 Javascript
利用原生js和jQuery实现单选框的勾选和取消操作的方法
Sep 04 Javascript
JQuery.validationEngine表单验证插件(推荐)
Dec 10 Javascript
Angular 4.x 动态创建表单实例
Apr 25 Javascript
JavaScript实现form表单的多文件上传
Mar 27 Javascript
iSlider手机端图片滑动切换插件使用详解
Dec 24 Javascript
JavaScript计算出两个数的差值
Mar 19 Javascript
微信小程序入门之绘制时钟
Oct 22 Javascript
TypeScript 内置高级类型编程示例
Sep 23 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水印
2007/03/16 PHP
PHP goto语句简介和使用实例
2014/03/11 PHP
PHP实现网页内容html标签补全和过滤的方法小结【2种方法】
2017/04/27 PHP
laravel框架之数据库查出来的对象实现转化为数组
2019/10/23 PHP
深入分析PHP设计模式
2020/06/15 PHP
脚本吧 - 幻宇工作室用到js,超强推荐share.js
2006/12/23 Javascript
收藏一些不常用,但是有用的代码
2007/03/12 Javascript
AlertBox 弹出层信息提示框效果实现步骤
2010/10/11 Javascript
使用GruntJS链接与压缩多个JavaScript文件过程详解
2013/08/02 Javascript
extjs_02_grid显示本地数据、显示跨域数据
2014/06/23 Javascript
只需五句话搞定JavaScript作用域(经典)
2016/07/26 Javascript
基于vue2的table分页组件实现方法
2017/03/20 Javascript
vue forEach循环数组拿到自己想要的数据方法
2018/09/21 Javascript
JavaScript中this用法学习笔记
2019/03/17 Javascript
javascript实现简单打字游戏
2019/10/29 Javascript
python 获取文件下所有文件或目录os.walk()的实例
2018/04/23 Python
解决Matplotlib图表不能在Pycharm中显示的问题
2018/05/24 Python
Python迷宫生成和迷宫破解算法实例
2019/12/24 Python
python判断正负数方式
2020/06/03 Python
Python 合并拼接字符串的方法
2020/07/28 Python
什么是serialVersionUID
2016/03/04 面试题
计算机应用专业应届毕业生中文求职信范文
2013/11/29 职场文书
24岁生日感言
2014/01/13 职场文书
精彩的英文自荐信
2014/01/30 职场文书
英文求职信写作小建议
2014/02/16 职场文书
《棉鞋里的阳光》教学反思
2014/04/24 职场文书
公司董事长岗位职责
2014/06/08 职场文书
反腐倡廉剖析材料
2014/09/30 职场文书
2014年个人工作总结报告
2014/11/27 职场文书
基石观后感
2015/06/12 职场文书
当你找不到方向的时候,不妨读读刘备的一生
2019/08/05 职场文书
MySQL表字段时间设置默认值
2021/05/13 MySQL
html+css实现文字折叠特效实例
2021/06/02 HTML / CSS
Java日常练习题,每天进步一点点(38)
2021/07/26 Java/Android
使用Redis做预定库存缓存功能
2022/04/02 Redis
win11自动弹出虚拟键盘怎么关闭? Win11关闭虚拟键盘的技巧
2023/01/09 数码科技