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 相关文章推荐
070823更新的一个[消息提示框]组件 兼容ie7
Aug 29 Javascript
jquery方法+js一般方法+js面向对象方法实现拖拽效果
Aug 30 Javascript
jQuery实现分章节锚点“回到顶部”动画特效代码
Oct 23 Javascript
Bootstrap3学习笔记(二)之排版
May 20 Javascript
jquery实现ajax提交表单信息的简单方法(推荐)
Aug 24 Javascript
浅谈jQuery为哪般去掉了浏览器检测
Aug 29 Javascript
使用node.js中的Buffer类处理二进制数据的方法
Nov 26 Javascript
Angular.JS利用ng-disabled属性和ng-model实现禁用button效果
Apr 05 Javascript
VUE页面中加载外部HTML的示例代码
Sep 20 Javascript
js阻止默认右键的下拉菜单方法
Jan 02 Javascript
js实现AI五子棋人机大战
May 28 Javascript
vue axios请求成功却进入catch的原因分析
Sep 08 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模块 Memcached功能多于Memcache
2011/06/14 PHP
php inc文件使用的风险和注意事项
2013/11/12 PHP
简单谈谈php中ob_flush和flush的区别
2014/11/27 PHP
php 微信公众平台开发模式实现多客服的实例代码
2016/11/07 PHP
Yii2框架配置文件(Application属性)与调试技巧实例分析
2019/05/27 PHP
thinkphp5.1框架模板布局与模板继承用法分析
2019/07/19 PHP
绑定回车enter事件代码
2014/05/18 Javascript
JavaScript代码轻松实现网页内容禁止复制(代码简单)
2015/10/23 Javascript
JS判断iframe是否加载完成的方法
2016/08/03 Javascript
微信小程序  wx.request合法域名配置详解
2016/11/23 Javascript
jQuery中用on绑定事件时需注意的事项
2017/03/19 Javascript
详解Vue如何支持JSX语法
2017/11/10 Javascript
浏览器调试动态js脚本的方法(图解)
2018/01/19 Javascript
基于vue-cli 路由 实现类似tab切换效果(vue 2.0)
2019/05/08 Javascript
python通过scapy获取局域网所有主机mac地址示例
2014/05/04 Python
在Django的模板中使用认证数据的方法
2015/07/23 Python
Python编程实现正则删除命令功能
2017/08/30 Python
基于numpy.random.randn()与rand()的区别详解
2018/04/17 Python
windows下python和pip安装教程
2018/05/25 Python
python3使用SMTP发送HTML格式邮件
2018/06/19 Python
Tesserocr库的正确安装方式
2018/10/19 Python
Python中的 enum 模块源码详析
2019/01/09 Python
解决Python中定时任务线程无法自动退出的问题
2019/02/18 Python
Python函数参数类型及排序原理总结
2019/12/19 Python
python操作gitlab API过程解析
2019/12/27 Python
Python中的wordcloud库安装问题及解决方法
2020/05/27 Python
简单掌握CSS3将文字描边及填充文字颜色的方法
2016/03/07 HTML / CSS
世界首屈一指的在线男士内衣权威:HisRoom
2017/08/05 全球购物
亲子读书活动方案
2014/02/22 职场文书
读群众路线心得体会
2014/03/07 职场文书
2015年助理工程师工作总结
2015/04/03 职场文书
故意杀人罪辩护词
2015/05/21 职场文书
2015年体检中心工作总结
2015/05/27 职场文书
安全生产标语口号
2015/12/26 职场文书
python区块链持久化和命令行接口实现简版
2022/05/25 Python
el-form每行显示两列底部按钮居中效果的实现
2022/08/05 HTML / CSS