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 相关文章推荐
LazyForm jQuery plugin 定制您的CheckBox Radio和Select
Oct 24 Javascript
分享20款好玩的jQuery游戏
Apr 17 Javascript
JavaScript打字小游戏代码
Dec 26 Javascript
javascript实现全角转半角的方法
Jan 23 Javascript
早该知道的7个JavaScript技巧
Jun 21 Javascript
javascript设计模式Constructor(构造器)模式
Aug 19 Javascript
用JS中split方法实现彩色文字背景效果实例
Aug 24 Javascript
B/S(Web)实时通讯解决方案分享
Apr 06 Javascript
node.js+captchapng+jsonwebtoken实现登录验证示例
Aug 17 Javascript
JS中的防抖与节流及作用详解
Apr 01 Javascript
基于jquery ajax的多文件上传进度条过程解析
Sep 11 jQuery
javascript中的相等操作符(==与===区别)
Dec 21 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
php中通过smtp发邮件的类,测试通过
2007/01/22 PHP
基于PHP导出Excel的小经验 完美解决乱码问题
2013/06/10 PHP
PHP第三方登录―QQ登录实现方法
2017/02/06 PHP
PHP中Laravel 关联查询返回错误id的解决方法
2017/04/01 PHP
PHP 与 js的通信(via ajax,json)
2010/11/16 Javascript
JavaScript 大数据相加的问题
2011/08/03 Javascript
40个有创意的jQuery图片和内容滑动及弹出插件收藏集之三
2012/01/03 Javascript
js控制的回到页面顶端goTop的代码实现
2013/03/20 Javascript
javaScript面向对象继承方法经典实现
2013/08/20 Javascript
高效率JavaScript编写技巧整理
2013/08/23 Javascript
js简单实现根据身份证号码识别性别年龄生日
2013/11/29 Javascript
基于JQuery实现的跑马灯效果(文字无缝向上翻动)
2016/12/02 Javascript
jQuery自定义元素右键点击事件(实现案例)
2017/04/28 jQuery
bootstrap手风琴折叠示例代码分享
2017/05/22 Javascript
Node.JS更改Windows注册表Regedit的方法小结
2017/08/18 Javascript
js中getBoundingClientRect的作用及兼容方案详解
2018/02/01 Javascript
AngularJS select加载数据选中默认值的方法
2018/02/28 Javascript
vue使用vue-i18n实现国际化的实现代码
2018/04/08 Javascript
vue.js input框之间赋值方法
2018/08/24 Javascript
浅谈vue websocket nodeJS 进行实时通信踩到的坑
2020/09/22 NodeJs
wxpython中利用线程防止假死的实现方法
2014/08/11 Python
Python中的默认参数详解
2015/06/24 Python
Python爬虫实现验证码登录代码实例
2019/05/10 Python
使用django的objects.filter()方法匹配多个关键字的方法
2019/07/18 Python
Python读取YAML文件过程详解
2019/12/30 Python
Python使用pdb调试代码的技巧
2020/05/03 Python
python字典key不能是可以是啥类型
2020/08/04 Python
aec加密 php_php aes加密解密类(兼容php5、php7)
2021/03/14 PHP
详解Html5微信支付爬坑之路
2018/07/24 HTML / CSS
飞利浦比利时官方网站:Philips比利时
2016/08/24 全球购物
在浏览器端如何得到服务器端响应的XML数据
2012/11/24 面试题
食堂个人先进事迹
2014/01/22 职场文书
食品质量与安全专业毕业生求职信
2014/08/11 职场文书
单方离婚协议书范本2014
2014/10/28 职场文书
2015年思想品德教学工作总结
2015/07/22 职场文书
详解Redis实现限流的三种方式
2021/04/27 Redis