深入理解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 12 Javascript
一个JQuery写的点击上下滚动的小例子
Aug 27 Javascript
JavaScript中的对象序列化介绍
Dec 30 Javascript
js实现的简单图片浮动效果完整实例
May 10 Javascript
jQuery实现可拖拽3D万花筒旋转特效
Jan 03 Javascript
AngularJS基于provider实现全局变量的读取和赋值方法
Jun 28 Javascript
JavaScript模块模式实例详解
Oct 25 Javascript
webpack中如何使用雪碧图的示例代码
Nov 11 Javascript
小程序使用watch监听数据变化的方法详解
Sep 20 Javascript
vue+vuex+axios从后台获取数据存入vuex,组件之间共享数据操作
Jul 31 Javascript
详解Vue3 Teleport 的实践及原理
Dec 02 Vue.js
TS 类型兼容教程示例详解
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
第十三节--对象串行化
2006/11/16 PHP
php桌面中心(四) 数据显示
2007/03/11 PHP
php+html5使用FormData对象提交表单及上传图片的方法
2015/02/11 PHP
PHP实现将多个文件中的内容合并为新文件的方法示例
2017/06/10 PHP
php之header的不同用法总结(实例讲解)
2017/11/28 PHP
理解 JavaScript 预解析
2009/10/25 Javascript
Javascript级联下拉菜单以及AJAX数据验证核心代码
2013/05/10 Javascript
javascript中for/in循环及使用技巧
2015/09/01 Javascript
JavaScript编写简单的计算器
2015/11/25 Javascript
基于Javascript实现倒计时功能
2016/02/22 Javascript
js点击任意区域弹出层消失实现代码
2016/12/27 Javascript
Angularjs使用指令做表单校验的方法
2017/03/31 Javascript
js 简易版滚动条实例(适用于移动端H5开发)
2017/06/26 Javascript
利用node.js爬取指定排名网站的JS引用库详解
2017/07/25 Javascript
vue父组件向子组件(props)传递数据的方法
2018/01/02 Javascript
在 React、Vue项目中使用SVG的方法
2018/02/09 Javascript
JS中利用FileReader实现上传图片前本地预览功能
2018/03/02 Javascript
Vue实现双向绑定的原理以及响应式数据的方法
2018/07/02 Javascript
浅谈Fetch 数据交互方式
2018/12/20 Javascript
Python数据类型详解(三)元祖:tuple
2016/05/08 Python
python按时间排序目录下的文件实现方法
2018/10/17 Python
Python批处理更改文件名os.rename的方法
2018/10/26 Python
python requests模拟登陆github的实现方法
2019/12/26 Python
python如何处理程序无法打开
2020/06/16 Python
John Varvatos官方网站:设计师男士时装
2017/02/08 全球购物
澳大利亚最好的厨具店:Kitchen Warehouse
2018/03/13 全球购物
DOUGLAS荷兰:购买香水和化妆品
2020/10/24 全球购物
薇姿法国官网:Vichy法国
2021/01/28 全球购物
四年级数学教学反思
2014/02/02 职场文书
《猴子种树》教学反思
2014/02/14 职场文书
人事专员职责
2014/02/22 职场文书
交通事故私了协议书
2014/04/16 职场文书
勾股定理课后反思
2014/04/26 职场文书
《曹冲称象》教学反思
2016/02/20 职场文书
基于Redis zSet实现滑动窗口对短信进行防刷限流的问题
2022/02/12 Redis
win10以太网连接不上怎么办?Win10连接以太网详细教程
2022/04/08 数码科技