深入理解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 相关文章推荐
javascript window.opener的用法分析
Apr 07 Javascript
jquery.validate使用攻略 第一部
Jul 01 Javascript
jQuery常用操作方法及常用函数总结
Jun 19 Javascript
AngularJS表单编辑提交功能实例
Feb 13 Javascript
javascript实现控制的多级下拉菜单
Jul 05 Javascript
jquery实现可点击伸缩与展开的菜单效果代码
Aug 31 Javascript
Jquery实现的简单轮播效果【附实例】
Apr 19 Javascript
JavaScript实战之菜单特效
Aug 16 Javascript
微信小程序 天气预报开发实例代码源码
Jan 20 Javascript
jQuery基本选择器和层次选择器学习使用
Feb 27 Javascript
Vue2.0 给Tab标签页和页面切换过渡添加样式的方法
Mar 13 Javascript
jQuery实现html可联动的百分比进度条
Mar 26 jQuery
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中的
2016/04/23 PHP
适合PHP初学者阅读的4本经典书籍
2016/09/23 PHP
SCP远程VPS快速搬家和WDCP升级php5.3安装memcached和eaccelerator教程
2017/07/27 PHP
PHP 结合 Boostrap 结合 js 实现学生列表删除编辑及搜索功能
2019/05/21 PHP
不一样的文字闪烁 轮番闪烁
2009/11/11 Javascript
JavaScript操作XML实例代码(获取新闻标题并分页,并分页)
2010/05/25 Javascript
jQuery制作仿腾讯web qq用户体验桌面
2013/08/20 Javascript
用JS做的简单的可折叠的两级树形菜单
2013/09/21 Javascript
jquery实现预览提交的表单代码分享
2014/05/21 Javascript
JavaScript编写连连看小游戏
2015/07/07 Javascript
基于jQuery实现复选框是否选中进行答题提示
2015/12/10 Javascript
jQuery+ajax实现文章点赞功能的方法
2015/12/31 Javascript
JavaScript中从setTimeout与setInterval到AJAX异步
2017/02/13 Javascript
javascript 玩转Date对象(实例讲解)
2017/07/11 Javascript
浅谈JS 数字和字符串之间相互转化的纠纷
2017/10/20 Javascript
VueJs 搭建Axios接口请求工具
2017/11/20 Javascript
详解如何搭建mpvue框架搭配vant组件库的小程序项目
2019/05/16 Javascript
使用PreloadJS加载图片资源的基础方法详解
2020/02/03 Javascript
es6中使用map简化复杂条件判断操作实例详解
2020/02/19 Javascript
Python3.5基础之函数的定义与使用实例详解【参数、作用域、递归、重载等】
2019/04/26 Python
python实现文件助手中查看微信撤回消息
2019/04/29 Python
python实现几种归一化方法(Normalization Method)
2019/07/31 Python
Windows下python3安装tkinter的问题及解决方法
2020/01/06 Python
Django values()和value_list()的使用
2020/03/31 Python
Python任务调度模块APScheduler使用
2020/04/15 Python
html5中 media(播放器)的api使用指南
2014/12/26 HTML / CSS
详解html5页面 rem 布局适配方法
2018/01/12 HTML / CSS
区优秀教师事迹材料
2014/02/10 职场文书
应届毕业生应聘自荐信范文
2014/02/26 职场文书
毕业寄语大全
2014/04/09 职场文书
学校爱心捐款倡议书
2014/05/13 职场文书
财务工作疏忽检讨书
2014/09/11 职场文书
我的职业生涯规划:打造自己的运动帝国
2014/09/18 职场文书
致青春观后感
2015/06/09 职场文书
公司保洁员管理制度
2015/08/04 职场文书
使用Python拟合函数曲线
2022/04/14 Python