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 相关文章推荐
js 手机号码合法性验证代码集合
Sep 29 Javascript
jquery特效 点击展示与隐藏全文
Dec 09 Javascript
JavaScript String 对象常用方法详解
May 13 Javascript
js canvas实现擦除动画
Jul 16 Javascript
用js写的一个路由(简单实例)
Sep 24 Javascript
Node.js中常规的文件操作总结
Oct 13 Javascript
原生js实现水平方向无缝滚动
Jan 10 Javascript
JavaScript实现两个select下拉框选项左移右移
Mar 09 Javascript
jQuery鼠标悬停内容动画切换效果
Apr 27 jQuery
node.js+express+mySQL+ejs+bootstrop实现网站登录注册功能
Jan 12 Javascript
Vue异步组件处理路由组件加载状态的解决方案
Sep 07 Javascript
vue+eslint+vscode配置教程
Aug 09 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公用函数列表[正则]
2007/02/22 PHP
php xml-rpc远程调用
2008/12/19 PHP
比较简单的一个符合web标准的JS调用flash方法
2007/11/29 Javascript
jquery ajax 检测用户注册时用户名是否存在
2009/11/03 Javascript
Flash图片上传组件 swfupload使用指南
2015/03/14 Javascript
js使用DOM操作实现简单留言板的方法
2015/04/10 Javascript
jQuery实现仿路边灯箱广告图片轮播效果
2015/04/15 Javascript
javascript简单实现类似QQ头像弹出效果的方法
2015/08/03 Javascript
js实现将选中值累加到文本框的方法
2015/08/12 Javascript
javascript实现状态栏中文字动态显示的方法
2015/10/20 Javascript
JS中with的替代方法与String中的正则方法详解
2016/12/23 Javascript
详解如何在项目中使用jest测试react native组件
2018/02/09 Javascript
Vue父子组建的简单通信之控制开关Switch的实现
2018/06/04 Javascript
JQuery Ajax动态加载Table数据的实例讲解
2018/08/09 jQuery
tweenjs缓动算法的使用实例分析
2019/08/26 Javascript
vue 父组件通过v-model接收子组件的值的代码
2019/10/27 Javascript
javascript用defineProperty实现简单的双向绑定方法
2020/04/03 Javascript
vue-calendar-component 封装多日期选择组件的实例代码
2020/12/04 Vue.js
跟老齐学Python之使用Python操作数据库(1)
2014/11/25 Python
python通过openpyxl生成Excel文件的方法
2015/05/12 Python
python实现列表中由数值查到索引的方法
2018/06/27 Python
Python + OpenCV 实现LBP特征提取的示例代码
2019/07/11 Python
详解Python 中sys.stdin.readline()的用法
2019/09/12 Python
matlab灰度图像调整及imadjust函数的用法详解
2020/02/27 Python
PyQt5 如何让界面和逻辑分离的方法
2020/03/24 Python
html5响应式开发自动计算fontSize的方法
2020/01/13 HTML / CSS
野兽派官方旗舰店:THE BEAST 野兽派
2016/08/05 全球购物
尼克松手表官网:Nixon手表
2019/03/17 全球购物
报到证丢失证明
2014/01/11 职场文书
水毁工程实施方案
2014/04/01 职场文书
《赠汪伦》教学反思
2014/04/12 职场文书
教师读书活动总结
2014/05/07 职场文书
优秀小学生事迹材料
2014/12/26 职场文书
教师见习总结范文
2015/06/23 职场文书
二年级数学教学反思
2016/02/16 职场文书
「女孩的钓鱼慢活」全新版权绘公布
2022/03/21 日漫