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的抓取博客园首页RSS的代码
Dec 01 Javascript
Javascript中查找不以XX字符结尾的单词示例代码
Oct 15 Javascript
提高jQuery性能的十个诀窍
Nov 14 Javascript
JavaScript中几种排序算法的简单实现
Jul 29 Javascript
批量下载对路网图片并生成html的实现方法
Jun 07 Javascript
bootstrap与Jquery UI 按钮样式冲突的解决办法
Sep 23 Javascript
详解vue之页面缓存问题(基于2.0)
Jan 10 Javascript
微信小程序 详解Page中data数据操作和函数调用
Jan 12 Javascript
Vue.js鼠标悬浮更换图片功能
May 17 Javascript
微信小程序实现默认第一个选中变色效果
Jul 17 Javascript
vue路由守卫,限制前端页面访问权限的例子
Nov 11 Javascript
js实现简单音乐播放器
Jun 30 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下关于Cannot use a scalar value as an array的解决办法
2010/08/08 PHP
ThinkPHP独立分组使用的注意事项
2014/11/25 PHP
PHP异常处理浅析
2015/05/12 PHP
一个小型js框架myJSFrame附API使用帮助
2008/06/28 Javascript
jQuery简单实现tab选项卡切换效果
2016/06/20 Javascript
JavaScript自定义函数实现查找两个字符串最长公共子串的方法
2016/11/24 Javascript
JS实现select选中option触发事件操作示例
2018/07/13 Javascript
[jQuery] 事件和动画详解
2019/03/05 jQuery
JavaScript实现单英文金山打字通
2020/07/24 Javascript
Vue项目环境搭建详细总结
2019/09/26 Javascript
微信小程序如何实现在线客服功能
2019/10/16 Javascript
[01:52]深扒TI7聊天轮盘语音出处7
2017/05/11 DOTA
Python 中 Meta Classes详解
2016/02/13 Python
python中如何使用正则表达式的集合字符示例
2017/10/09 Python
pandas groupby 分组取每组的前几行记录方法
2018/04/20 Python
Python实现简单查找最长子串功能示例
2019/02/26 Python
python 列表中[ ]中冒号‘:’的作用
2019/04/30 Python
Python3 执行系统命令并获取实时回显功能
2019/07/09 Python
anaconda中更改python版本的方法步骤
2019/07/14 Python
matlab中二维插值函数interp2的使用详解
2020/04/22 Python
python如何使用代码运行助手
2020/07/03 Python
Python 在局部变量域中执行代码
2020/08/07 Python
Python绘图实现台风路径可视化代码实例
2020/10/23 Python
DRF使用simple JWT身份验证的实现
2021/01/14 Python
可以随进度显示不同颜色的css3进度条分享
2014/04/11 HTML / CSS
Probikekit日本:自行车套件,跑步和铁人三项装备
2017/04/03 全球购物
比利时香水网上商店:NOTINO
2018/03/28 全球购物
数控专业推荐信范文
2013/12/02 职场文书
大学自主招生自荐信范文
2014/02/26 职场文书
保护地球的标语
2014/06/17 职场文书
四风问题专项整治工作情况报告
2014/10/28 职场文书
工作年限证明模板
2015/06/15 职场文书
海底两万里读书笔记
2015/06/26 职场文书
2015年国培研修感言
2015/08/01 职场文书
大学生饮品店创业计划书范文
2019/07/10 职场文书
Redis高并发缓存架构性能优化
2022/05/15 Redis