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 对表格的行和列都能加亮显示
Dec 26 Javascript
使用jquery hover事件实现表格的隔行换色功能示例
Sep 03 Javascript
JavaScript中检测变量是否存在遇到的一些问题
Nov 11 Javascript
jQuery中clone()方法用法实例
Jan 16 Javascript
自定义刻度jQuery进度条及插件
Sep 02 Javascript
js表单中选择框值的获取及表单的序列化
Dec 17 Javascript
javascript鼠标跟随运动3种效果(眼球效果,苹果菜单,方向跟随)
Oct 27 Javascript
详解使用angular-cli发布i18n多国语言Angular应用
May 20 Javascript
详解vue组件中使用路由方法
Feb 12 Javascript
js实现简单的贪吃蛇游戏
Apr 23 Javascript
vue实现下拉菜单树
Oct 22 Javascript
ant design 日期格式化的实现
Oct 27 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 邮件发送问题解决
2014/03/22 PHP
PHP中使用sleep造成mysql读取失败的案例和解决方法
2014/08/21 PHP
php 生成Tab键或逗号分隔的CSV
2016/09/24 PHP
Yii2实现增删改查后留在当前页的方法详解
2017/01/13 PHP
TP5(thinkPHP框架)实现后台清除缓存功能示例
2019/05/29 PHP
javascript编程起步(第五课)
2007/01/10 Javascript
javascript中文本框中输入法切换的问题
2013/12/10 Javascript
javaScript 计算两个日期的天数相差(示例代码)
2013/12/27 Javascript
jquery $(&quot;#variable&quot;) 循环改变variable的值示例
2014/02/23 Javascript
移动端点击图片放大特效PhotoSwipe.js插件实现
2016/08/25 Javascript
jsTree使用记录实例
2016/12/01 Javascript
vue项目中使用ueditor的实例讲解
2018/03/05 Javascript
Element PageHeader页头的使用方法
2020/07/26 Javascript
vant 时间选择器--开始时间和结束时间实例
2020/11/04 Javascript
Python中的特殊语法:filter、map、reduce、lambda介绍
2015/04/14 Python
Perl中著名的Schwartzian转换问题解决实现
2015/06/02 Python
python转换字符串为摩尔斯电码的方法
2015/07/06 Python
详解Django框架中用户的登录和退出的实现
2015/07/23 Python
详谈python在windows中的文件路径问题
2018/04/28 Python
Flask模拟实现CSRF攻击的方法
2018/07/24 Python
Python中整数的缓存机制讲解
2019/02/16 Python
Python3实现的简单三级菜单功能示例
2019/03/12 Python
python实现打砖块游戏
2020/02/25 Python
win7上tensorflow2.2.0安装成功 引用DLL load failed时找不到指定模块 tensorflow has no attribute xxx 解决方法
2020/05/20 Python
python合并多个excel文件的示例
2020/09/23 Python
在网上学习全世界最好的课程:Coursera
2017/11/07 全球购物
关于.NET, HTML的五个问题
2012/08/29 面试题
污水厂厂长岗位职责
2014/01/04 职场文书
家居装修公司创业计划书范文
2014/03/20 职场文书
科技节口号
2014/06/19 职场文书
2015年保安个人工作总结
2015/04/02 职场文书
2015年技术工作总结范文
2015/04/20 职场文书
骆驼祥子读书笔记
2015/06/26 职场文书
2016年学校安全教育月活动总结
2016/04/06 职场文书
Java实现房屋出租系统详解
2021/10/05 Java/Android
python文件与路径操作神器 pathlib
2022/04/01 Python