Vue watch响应数据实现方法解析


Posted in Javascript onJuly 10, 2020

在vue中,使用watch来响应数据的变化。watch的用法大致有三种。下面代码是watch的一种简单的用法:

<input type="text" v-model="cityName"/>

new Vue({
 el: '#root',
 data: {
  cityName: 'shanghai'
 },
 watch: {
  cityName(newName, oldName) {
   // ...
  }
 } 
})

直接写一个监听处理函数,当每次监听到 cityName 值发生改变时,执行函数。也可以在所监听的数据后面直接加字符串形式的方法名:

watch: {
  cityName: 'nameChange'
  }
 }

immediate和handler

这样使用watch时有一个特点,就是当值第一次绑定的时候,不会执行监听函数,只有值发生改变才会执行。如果我们需要在最初绑定值的时候也执行函数,则就需要用到immediate属性。

比如当父组件向子组件动态传值时,子组件props首次获取到父组件传来的默认值时,也需要执行函数,此时就需要将immediate设为true。

new Vue({
 el: '#root',
 data: {
  cityName: ''
 },
 watch: {
  cityName: {
  handler(newName, oldName) {
   
// ...
  
},
  
immediate: true
  }
 } 
})

监听的数据后面写成对象形式,包含handler方法和immediate,之前我们写的函数其实就是在写这个handler方法;

immediate表示在watch中首次绑定的时候,是否执行handler,值为true则表示在watch中声明的时候,就立即执行handler方法,值为false,则和一般使用watch一样,在数据发生变化的时候才执行handler。

deep

当需要监听一个对象的改变时,普通的watch方法无法监听到对象内部属性的改变,只有data中的数据才能够监听到变化,此时就需要deep属性对对象进行深度监听。

<input type="text" v-model="cityName.name"/>

new Vue({
 el: '#root',
 data: {
  cityName: {id: 1, name: 'shanghai'}
 },
 watch: {
  cityName: {
   handler(newName, oldName) {
   // ...
  },
  deep: true,
  immediate: true
  }
 } 
})

设置deep: true 则可以监听到cityName.name的变化,此时会给cityName的所有属性都加上这个监听器,当对象属性较多时,每个属性值的变化都会执行handler。如果只需要监听对象中的一个属性值,则可以做以下优化:使用字符串的形式监听对象属性:

watch: {
  'cityName.name': {
   handler(newName, oldName) {
   // ...
   },
   deep: true,
   immediate: true
  }
 }

这样只会给对象的某个特定的属性加监听器。

数组(一维、多维)的变化不需要通过深度监听,对象数组中对象的属性变化则需要deep深度监听。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
原创javascript小游戏实现代码
Aug 19 Javascript
jquerydom对象的事件隐藏显示和对象数组示例
Dec 10 Javascript
js AppendChild与insertBefore用法详细对比
Dec 16 Javascript
js 立即调用的函数表达式如何写
Jan 12 Javascript
jQuery ajax调用后台aspx后台文件的两种常见方法(不是ashx)
Jun 28 Javascript
jQuery使用serialize()表单序列化时出现中文乱码问题的解决办法
Jul 27 Javascript
AngularJS基础 ng-options 指令详解
Aug 02 Javascript
javascript中href和replace的比较(详解)
Nov 25 Javascript
jQuery实现 RadioButton做必选校验功能
Jun 15 jQuery
bootstrap table表格插件之服务器端分页实例代码
Sep 12 Javascript
JQuery使用属性addClass、removeClass和toggleClass实现增加和删除类操作示例
Nov 18 jQuery
vue 组件简介
Jul 31 Javascript
详解Vue之事件处理
Jul 10 #Javascript
jQuery开发仿QQ版音乐播放器
Jul 10 #jQuery
Element图表初始大小及窗口自适应实现
Jul 10 #Javascript
Vue路由切换页面不更新问题解决方案
Jul 10 #Javascript
简单了解Vue computed属性及watch区别
Jul 10 #Javascript
通过实例解析chrome如何在mac环境中安装vue-devtools插件
Jul 10 #Javascript
基于vue+element实现全局loading过程详解
Jul 10 #Javascript
You might like
星际实力自我测试
2020/03/04 星际争霸
php5 mysql分页实例代码
2008/04/10 PHP
php面向对象全攻略 (六)__set() __get() __isset() __unset()的用法
2009/09/30 PHP
shopex中集成的站长统计功能的代码简单分析
2011/08/11 PHP
Thinkphp使用mongodb数据库实现多条件查询方法
2014/06/26 PHP
lib.utf.js
2007/08/21 Javascript
js 数组的for循环到底应该怎么写?
2010/05/31 Javascript
这段js代码得节约你多少时间
2011/12/20 Javascript
jQuery中attr()和prop()在修改checked属性时的区别
2014/07/18 Javascript
新手快速学习JavaScript免费教程资源汇总
2015/06/25 Javascript
jQuery中ajax的load()与post()方法实例详解
2016/01/05 Javascript
老司机带你解读jQuery插件开发流程
2016/05/16 Javascript
浅谈js的url解析函数封装
2016/06/28 Javascript
Google 地图事件实例讲解
2016/08/06 Javascript
JavaScript实现清空(重置)文件类型INPUT元素值的方法
2016/11/17 Javascript
学习使用bootstrap的modal和carousel
2016/12/09 Javascript
详解AngularJS验证、过滤器、指令
2017/01/04 Javascript
windows 下安装nodejs 环境变量设置
2017/02/02 NodeJs
JS实现评价的星星功能
2017/08/20 Javascript
简单谈谈vue的过渡动画(推荐)
2017/10/11 Javascript
Bootstrap popover 实现鼠标移入移除显示隐藏功能方法
2018/01/24 Javascript
Vue项目移动端滚动穿透问题的实现
2020/05/19 Javascript
[19:59]2014DOTA2国际邀请赛 IG战队纪录片
2014/08/07 DOTA
[01:01:41]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Magma BO3 第二场 1月31日
2021/03/11 DOTA
Python3使用pandas模块读写excel操作示例
2018/07/03 Python
python判断列表的连续数字范围并分块的方法
2018/11/16 Python
python字符串替换re.sub()方法解析
2019/09/18 Python
Python爬虫爬取煎蛋网图片代码实例
2019/12/16 Python
使用TensorBoard进行超参数优化的实现
2020/07/06 Python
html5使用canvas实现图片下载功能的示例代码
2017/08/26 HTML / CSS
GLAMGLOW格莱魅美国官网:美国知名的面膜品牌
2016/12/31 全球购物
美国排名第一的泳池用品直接来源:In The Swim
2019/09/23 全球购物
部门2014年度工作总结
2014/11/12 职场文书
七一表彰大会简报
2015/07/20 职场文书
原生Javascript+HTML5一步步实现拖拽排序
2021/06/12 Javascript
Python编写冷笑话生成器
2022/04/20 Python