深入理解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的递增/递减运算符和带操作的赋值运算符的等价式
Dec 08 Javascript
eval与window.eval的差别分析
Mar 17 Javascript
JS页面延迟执行一些方法(整理)
Nov 11 Javascript
Js表格万条数据瞬间加载实现代码
Feb 20 Javascript
jQuery中事件对象e的事件冒泡用法示例介绍
Apr 25 Javascript
详解Node.js模块间共享数据库连接的方法
May 24 Javascript
深入理解JavaScript函数参数(推荐)
Jul 26 Javascript
Google 地图叠加层实例讲解
Aug 06 Javascript
利用原生js和jQuery实现单选框的勾选和取消操作的方法
Sep 04 Javascript
在vue项目中使用sass的配置方法
Mar 20 Javascript
深入浅析Vue中的Prop
Jun 10 Javascript
JS数组reduce()方法原理及使用技巧解析
Jul 14 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
thinkphp 中的volist标签在ajax操作中的特殊性(推荐)
2018/01/15 PHP
PHP使用DOM对XML解析处理操作示例
2019/07/04 PHP
网页自动跳转代码收集
2009/09/27 Javascript
JQuery自定义事件的应用 JQuery最佳实践
2010/08/01 Javascript
JavaScript中的作用域链和闭包
2012/06/30 Javascript
利用javascript数组长度循环数组内所有元素
2013/12/27 Javascript
使用jQuery中的when实现多个AJAX请求对应单个回调的例子分享
2014/04/23 Javascript
js实现简单鼠标跟随效果的方法
2015/04/10 Javascript
js时间戳和c#时间戳互转方法(推荐)
2017/02/15 Javascript
从零学习node.js之模块规范(一)
2017/02/21 Javascript
关于前后端json数据的发送与接收详解
2017/07/30 Javascript
react开发教程之React 组件之间的通信方式
2017/08/12 Javascript
Angular简单验证功能示例
2017/12/22 Javascript
详解angular如何调用HTML字符串的方法
2018/06/30 Javascript
Vue的路由及路由钩子函数的实现
2019/07/02 Javascript
jquery实现吸顶导航效果
2020/01/08 jQuery
Python的Scrapy爬虫框架简单学习笔记
2016/01/20 Python
深入解读Python解析XML的几种方式
2016/02/16 Python
Python 含参构造函数实例详解
2017/05/25 Python
Python实现删除文件中含“指定内容”的行示例
2017/06/09 Python
简单实现python收发邮件功能
2018/01/05 Python
PYQT5实现控制台显示功能的方法
2019/06/25 Python
python将时分秒转换成秒的实例
2019/12/07 Python
tensorflow常用函数API介绍
2020/04/19 Python
浅谈Python3多线程之间的执行顺序问题
2020/05/02 Python
为什么python比较流行
2020/06/19 Python
实例教程 利用html5和css3打造一款创意404页面
2014/10/20 HTML / CSS
运动鞋、街头服装、手表和手袋的实时市场:StockX
2020/11/25 全球购物
一些Solaris面试题
2013/03/22 面试题
大学团支书的自我评价分享
2013/12/14 职场文书
写给女生的道歉信
2014/01/14 职场文书
滴水洞导游词
2015/02/10 职场文书
实习单位鉴定意见
2015/06/04 职场文书
新闻报道稿范文
2015/07/23 职场文书
如何理解Vue简单状态管理之store模式
2021/05/15 Vue.js
angular异步验证器防抖实例详解
2022/03/31 Javascript