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 相关文章推荐
jQuery AjaxQueue改进步骤
Oct 06 Javascript
基于jquery实现点击左右按钮图片横向滚动
Apr 11 Javascript
用jquery写的一个万年历(自写)
Jan 20 Javascript
jQuery实现网页顶部固定导航效果代码
Dec 24 Javascript
正则表达式,替换所有HTML标签的简单实例
Nov 28 Javascript
Angular的$http的ajax的请求操作(推荐)
Jan 10 Javascript
移动前端图片压缩上传的实例
Dec 06 Javascript
浅析Proxy可以优化vue的数据监听机制问题及实现思路
Nov 29 Javascript
微信小程序实现上传图片裁剪图片过程解析
Aug 22 Javascript
layer弹出层显示在top顶层的方法
Sep 11 Javascript
基于js实现数组相邻元素上移下移
May 19 Javascript
JavaScript实现HSL拾色器
May 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 中dirname(_file_)讲解
2007/03/18 PHP
php连接mysql数据库代码
2009/03/10 PHP
PHP中去除换行解决办法小结(PHP_EOL)
2011/11/27 PHP
php解析url的三个示例
2014/01/20 PHP
PHP get_html_translation_table()函数用法讲解
2019/02/16 PHP
通过PHP实现获取访问用户IP
2020/05/09 PHP
基于PHP+mysql实现新闻发布系统的开发
2020/08/06 PHP
js图片自动轮播代码分享(js图片轮播)
2014/05/06 Javascript
JavaScript实现的双向跨域插件分享
2015/01/31 Javascript
JavaScript实现LI列表数据绑定的方法
2015/08/04 Javascript
js实现网页多级级联菜单代码
2015/08/20 Javascript
深入解析JavaScript框架Backbone.js中的事件机制
2016/02/14 Javascript
JS中artdialog弹出框控件之提交表单思路详解
2016/04/18 Javascript
详解JavaScript设计模式开发中的桥接模式使用
2016/05/18 Javascript
Vue.js递归组件实现组织架构树和选人功能
2019/07/04 Javascript
原生JavaScript之es6中Class的用法分析
2020/02/23 Javascript
[05:46]2018完美盛典-《同梦共竞》
2018/12/17 DOTA
[01:20:47]DOTA2-DPC中国联赛 正赛 Ehome vs Magma BO3 第一场 1月19日
2021/03/11 DOTA
使用Kivy将python程序打包为apk文件
2017/07/29 Python
python os用法总结
2018/06/08 Python
Python http接口自动化测试框架实现方法示例
2018/12/06 Python
Pyqt清空某一个QTreeewidgetItem下的所有分支方法
2019/06/17 Python
python字典排序的方法
2019/10/12 Python
使用Python爬虫库requests发送请求、传递URL参数、定制headers
2020/01/25 Python
Pytest参数化parametrize使用代码实例
2020/02/22 Python
TensorFLow 数学运算的示例代码
2020/04/21 Python
用python写一个带有gui界面的密码生成器
2020/11/06 Python
python实现跨年表白神器--你值得拥有
2021/01/04 Python
UGG美国官网:购买UGG雪地靴、拖鞋和鞋子
2017/12/31 全球购物
Canal官网:巴西女性时尚品牌
2019/10/16 全球购物
年终总结会主持词
2014/03/25 职场文书
党章培训心得体会
2014/09/04 职场文书
民政局办理协议离婚(范本)
2014/10/25 职场文书
司机个人年终总结
2015/03/03 职场文书
预备党员自我评价范文
2015/03/04 职场文书
初一军训感言
2015/08/01 职场文书