深入理解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 面向对象之重载
May 04 Javascript
JS中的prototype与面向对象的实例讲解
May 22 Javascript
JS 实现图片直接下载示例代码
Jul 22 Javascript
JavaScript让网页出现渐隐渐显背景颜色的方法
Apr 21 Javascript
基于jQuery实现以手风琴方式展开和折叠导航菜单
Jan 28 Javascript
js 实现获取name 相同的页面元素并循环遍历的方法
Feb 14 Javascript
使用vue.js写一个tab选项卡效果
Mar 25 Javascript
vue loadmore 组件滑动加载更多源码解析
Jul 19 Javascript
vue-quill-editor+plupload富文本编辑器实例详解
Oct 19 Javascript
解决vue中使用proxy配置不同端口和ip接口问题
Aug 14 Javascript
Vue+Vuex实现自动登录的知识点详解
Mar 04 Javascript
JS监听Esc 键触发事键
Apr 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
php结合正则获取字符串中数字
2015/06/19 PHP
详解Yii实现分页的两种方法
2017/01/14 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
2017/11/10 PHP
让whoops帮我们告别ThinkPHP6的异常页面
2020/03/02 PHP
基于datagrid框架的查询
2013/04/08 Javascript
Jquery插件编写简明教程
2014/03/25 Javascript
解决bootstrap中modal遇到Esc键无法关闭页面
2015/03/09 Javascript
深入理解js函数的作用域与this指向
2016/05/28 Javascript
jQuery 3.0 的 setter和getter 模式详解
2016/07/11 Javascript
BootStrap下拉框在firefox浏览器界面不友好的解决方案
2016/08/18 Javascript
webpack多页面开发实践
2017/12/18 Javascript
React Native开发封装Toast与加载Loading组件示例
2018/09/08 Javascript
JavaScript私有变量实例详解
2019/01/24 Javascript
javascript实现图片轮播代码
2019/07/09 Javascript
JavaScript变量基本使用方法实例分析
2019/11/15 Javascript
python线程锁(thread)学习示例
2013/12/04 Python
Python实现的一个找零钱的小程序代码分享
2014/08/25 Python
wxPython窗口的继承机制实例分析
2014/09/28 Python
python自动化测试之从命令行运行测试用例with verbosity
2014/09/28 Python
linux 下实现python多版本安装实践
2014/11/18 Python
研究Python的ORM框架中的SQLAlchemy库的映射关系
2015/04/25 Python
Python自动扫雷实现方法
2015/07/25 Python
Python中static相关知识小结
2018/01/02 Python
python2与python3的print及字符串格式化小结
2018/11/30 Python
python 实现调用子文件下的模块方法
2018/12/07 Python
由Python编写的MySQL管理工具代码实例
2019/04/09 Python
pycharm配置git(图文教程)
2019/08/16 Python
Python sep参数使用方法详解
2020/02/12 Python
CSS3 优势以及网页设计师如何使用CSS3技术
2009/07/29 HTML / CSS
HTML5的video标签的浏览器兼容性增强方案分享
2016/05/19 HTML / CSS
Edwaybuy西班牙:小米在线商店
2019/12/04 全球购物
中秋节礼品促销方案
2014/02/02 职场文书
数学高效课堂实施方案
2014/03/29 职场文书
停电通知范文
2015/04/16 职场文书
教你怎么用Python操作MySql数据库
2021/05/31 Python
Python用tkinter实现自定义记事本的方法详解
2022/03/31 Python