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 相关文章推荐
贴一个在Mozilla中常用的Javascript代码
Jan 09 Javascript
High Performance JavaScript(高性能JavaScript)读书笔记分析
May 05 Javascript
利用jQuery实现可输入搜索文字的下拉框
Oct 23 Javascript
JS实现5秒钟自动封锁div层的方法
Feb 20 Javascript
jQuery插件Tmpl的简单使用方法
Apr 27 Javascript
jQuery+CSS3实现3D立方体旋转效果
Nov 10 Javascript
javascript HTML5 Canvas实现圆盘抽奖功能
Apr 11 Javascript
有关easyui-layout中的收缩层无法显示标题的解决办法
May 10 Javascript
详解Angular2中的编程对象Observable
Sep 17 Javascript
JS实现微信弹出搜索框 多条件查询功能
Dec 13 Javascript
解决Vue2.0中使用less给元素添加背景图片出现的问题
Sep 03 Javascript
vue中多路由表头吸顶实现的几种布局方式
Apr 12 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编码规范的深入探讨
2013/06/06 PHP
php实现批量删除挂马文件及批量替换页面内容完整实例
2016/07/08 PHP
PHP实现页面静态化的超简单方法
2016/09/06 PHP
PHP设计模式之适配器模式定义与用法详解
2018/04/03 PHP
windows 2008r2+php5.6.28环境搭建详细过程
2019/06/18 PHP
关于__defineGetter__ 和__defineSetter__的说明
2007/05/12 Javascript
javascript IE中的DOM ready应用技巧
2008/07/23 Javascript
JavaScript 学习笔记(十二) dom
2010/01/21 Javascript
通过JavaScript使Div居中并随网页大小改变而改变
2013/06/24 Javascript
jQuery判断checkbox是否选中的小例子
2013/12/02 Javascript
js格式化时间和js格式化时间戳示例
2014/02/10 Javascript
jquery取子节点及当前节点属性值的方法
2014/09/09 Javascript
JavaScript AOP编程实例
2015/06/16 Javascript
兼容各大浏览器的JavaScript阻止事件冒泡代码
2015/07/09 Javascript
js获取当前日期时间及其它日期操作汇总
2016/03/08 Javascript
NodeJS自定义模块写法(详解)
2017/06/27 NodeJs
浅谈vue项目打包优化策略
2018/09/29 Javascript
vue + any-touch实现一个iscroll 实现拖拽和滑动动画效果
2019/04/08 Javascript
Vue的编码技巧与规范使用详解
2019/08/28 Javascript
JavaScript实现左右滚动电影画布
2020/02/06 Javascript
python制作websocket服务器实例分享
2016/11/20 Python
python中numpy包使用教程之数组和相关操作详解
2017/07/30 Python
Python hashlib模块用法实例分析
2018/06/12 Python
pycharm修改界面主题颜色的方法
2019/01/17 Python
通过 Python 和 OpenCV 实现目标数量监控
2020/01/05 Python
matlab中imadjust函数的作用及应用举例
2020/02/27 Python
python中的错误如何查看
2020/07/08 Python
一个入门级python爬虫教程详解
2021/01/27 Python
几款主流好用的富文本编辑器(所见即所得常用编辑器)介绍
2021/03/17 Javascript
周仰杰(JIMMY CHOO)法国官方网站:闻名世界的鞋子品牌
2019/09/27 全球购物
波兰在线杂货店:Polski Koszyk
2019/11/02 全球购物
教师师德师风自我剖析材料
2014/09/29 职场文书
专题组织生活会思想汇报
2014/10/01 职场文书
2015领导干部廉洁自律工作总结
2015/07/23 职场文书
JavaScript实现酷炫的鼠标拖尾特效
2022/02/18 Javascript
【海涛解说】暗牧也疯狂,牛蛙成配角
2022/04/01 DOTA