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注入技巧
Jun 22 Javascript
两个select之间option的互相添加操作(jquery实现)
Nov 12 Javascript
jquery1.4 教程二 ajax方法的改进
Feb 25 Javascript
有趣的JavaScript数组长度问题代码说明
Jan 20 Javascript
在页面上用action传递参数到后台出现乱码的解决方法
Dec 31 Javascript
node.js中的fs.chown方法使用说明
Dec 16 Javascript
JavaScript移除数组内重复元素的方法
Mar 18 Javascript
基于jQuery全屏焦点图左右切换插件responsiveslides
Sep 07 Javascript
简单谈谈原生js的math对象
Jun 27 Javascript
Vue.js中extend选项和delimiters选项的比较
Jul 17 Javascript
Angular 组件之间的交互的示例代码
Mar 24 Javascript
jquery.pagination.js分页使用教程
Oct 23 jQuery
详解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
解析PHPExcel使用的常用说明以及把PHPExcel整合进CI框架的介绍
2013/06/24 PHP
PHP正则匹配到2个字符串之间的内容方法
2018/12/24 PHP
如何使用jquery控制CSS样式,并且取消Css样式(如背景色,有实例)
2013/07/09 Javascript
js函数名与form表单元素同名冲突的问题
2014/03/07 Javascript
js识别uc浏览器的代码
2015/11/06 Javascript
基于jquery实现页面滚动到底自动加载数据的功能
2015/12/19 Javascript
javascript每日必学之多态
2016/02/23 Javascript
分享javascript实现的冒泡排序代码并优化
2016/06/05 Javascript
如何写好你的JavaScript【推荐】
2017/03/02 Javascript
jQuery使用正则验证15/18身份证的方法示例
2017/04/27 jQuery
微信小程序中input标签详解及简单实例
2017/05/18 Javascript
AngularJS 异步解决实现方法
2017/06/12 Javascript
js获取地址栏参数的两种方法
2017/06/27 Javascript
Vue的土著指令和自定义指令实例详解
2018/02/04 Javascript
实例详解Vue项目使用eslint + prettier规范代码风格
2018/08/20 Javascript
Nodejs中使用puppeteer控制浏览器中视频播放功能
2019/08/26 NodeJs
浅析JavaScript预编译和暗示全局变量
2020/09/03 Javascript
Vue中inheritAttrs的使用实例详解
2020/12/31 Vue.js
35个Python编程小技巧
2014/04/01 Python
Python实现的RSS阅读器实例
2015/07/25 Python
Python中标准库OS的常用方法总结大全
2017/07/19 Python
如何在python中使用selenium的示例
2017/12/26 Python
Python:Scrapy框架中Item Pipeline组件使用详解
2017/12/27 Python
Python键盘输入转换为列表的实例
2018/06/23 Python
python 提取tuple类型值中json格式的key值方法
2018/12/31 Python
PyQt5组件读取参数的实例
2019/06/25 Python
windows上安装python3教程以及环境变量配置详解
2019/07/18 Python
python程序中的线程操作 concurrent模块使用详解
2019/09/23 Python
python实现启动一个外部程序,并且不阻塞当前进程
2020/12/05 Python
如何用python 操作zookeeper
2020/12/28 Python
css3实现3D色子翻转特效
2014/12/23 HTML / CSS
Veronica Beard官网:在酷、经典和别致之间找到了平衡
2018/01/11 全球购物
幼儿教师自我鉴定
2013/11/02 职场文书
汽车专业毕业生自荐信
2013/11/03 职场文书
国贸专业求职信
2014/06/28 职场文书
公司酒会致辞
2015/07/30 职场文书