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 相关文章推荐
createElement动态创建HTML对象脚本代码
Nov 24 Javascript
再论Javascript下字符串连接的性能
Mar 05 Javascript
js字母大小写转换实现方法总结
Nov 13 Javascript
JS实现文字链接感应鼠标淡入淡出改变颜色的方法
Feb 26 Javascript
javascript编程异常处理实例小结
Nov 30 Javascript
Js类的静态方法与实例方法区分及jQuery拓展的两种方法
Jun 03 Javascript
浅谈JS的基础类型与引用类型
Sep 13 Javascript
BootStrap轻松实现微信页面开发代码分享
Oct 21 Javascript
微信小程序-消息提示框实例
Nov 24 Javascript
vue 中动态绑定class 和 style的方法代码详解
Jun 01 Javascript
vue中实现图片压缩 file文件的方法
May 28 Javascript
vue 使用原生组件上传图片的实例
Sep 08 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
linux下为php添加curl扩展的方法
2011/07/29 PHP
隐性调用php程序的方法
2015/06/13 PHP
CSS中简写属性要注意TRouBLe的顺序问题(避免踩坑)
2021/03/09 HTML / CSS
html中table数据排序的js代码
2011/08/09 Javascript
浅谈jQuery构造函数分析
2015/05/11 Javascript
javascript中传统事件与现代事件
2015/06/23 Javascript
超赞的动手创建JavaScript框架的详细教程
2015/06/30 Javascript
JS实现鼠标滑过折叠与展开菜单效果代码
2015/09/06 Javascript
JS+CSS实现简单的二级下拉导航菜单效果
2015/09/21 Javascript
JavaScript代码性能优化总结(推荐)
2016/05/16 Javascript
JS判断来路是否是百度等搜索索引进行弹窗或自动跳转的实现代码
2016/10/09 Javascript
Vue自定义指令拖拽功能示例
2017/02/17 Javascript
微信小程序 request接口的封装实例代码
2017/04/26 Javascript
js链表操作(实例讲解)
2017/08/29 Javascript
React Native日期时间选择组件的示例代码
2018/04/27 Javascript
深入理解Vue父子组件生命周期执行顺序及钩子函数
2018/08/12 Javascript
React+Webpack快速上手指南(小结)
2018/08/15 Javascript
angular6的响应式表单的实现
2018/10/10 Javascript
深入学习JavaScript中的bom
2019/05/27 Javascript
如何用webpack4.0撸单页/多页脚手架 (jquery, react, vue, typescript)
2019/06/18 jQuery
vue实现简单加法计算器
2020/10/22 Javascript
浅谈Python生成器generator之next和send的运行流程(详解)
2017/05/08 Python
Python基于matplotlib绘制栈式直方图的方法示例
2017/08/09 Python
Python实现句子翻译功能
2017/11/14 Python
python简单实例训练(21~30)
2017/11/15 Python
Pandas数据分析的一些常用小技巧
2021/02/07 Python
最耐用行李箱,一箱永流传:Briggs & Riley(全球终身保修)
2017/12/07 全球购物
舞会礼服和舞会鞋:PromGirl
2019/04/22 全球购物
中介业务员岗位职责
2014/04/09 职场文书
组织鉴定材料
2014/06/02 职场文书
暑期培训班招生方案
2014/08/26 职场文书
秋季运动会加油词
2015/07/18 职场文书
web前端之css水平居中代码解析
2021/05/20 HTML / CSS
pytorch交叉熵损失函数的weight参数的使用
2021/05/24 Python
解决mysql问题:由于找不到MSVCR120.dll,无法继续执行代码
2021/06/26 MySQL
HTML5中的DOCUMENT.VISIBILITYSTATE属性详解
2023/05/07 HTML / CSS