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创建Silverlight Plugin以及自定义nonSilverlight和lowSilverlight样式
Jun 28 Javascript
CSS和Javascript简单复习资料
Jun 29 Javascript
jQuery 中使用JSON的实现代码
Dec 01 Javascript
JavaScript面向对象(极简主义法minimalist approach)
Jul 17 Javascript
网页中可关闭的漂浮窗口实现可自行调节
Aug 20 Javascript
JavaScript闭包函数访问外部变量的方法
Aug 27 Javascript
详解JavaScript的闭包、IIFE、apply、函数与对象
Dec 21 Javascript
vue实现滑动超出指定距离回顶部功能
Jul 31 Javascript
150行Node.js实现的dns代理工具
Aug 02 Javascript
vue实现下拉加载其实没那么复杂
Aug 13 Javascript
微信小程序自定义弹出模态框禁止底部滚动功能
Mar 09 Javascript
vue3.0 数字翻牌组件的使用方法详解
Apr 20 Vue.js
详解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/09 PHP
PHP实现事件机制实例分析
2015/06/26 PHP
PHP实现用户异地登录提醒功能的方法【基于thinkPHP框架】
2018/03/15 PHP
爱恋千雪-US-AscII加密解密工具(网页加密)下载
2007/06/06 Javascript
JQuery index()方法使用代码
2010/06/02 Javascript
JQury slideToggle闪烁问题及解决办法
2011/07/05 Javascript
解析JavaScript中instanceof对于不同的构造器或许都返回true
2013/12/03 Javascript
JQuery Tips相关(1)----关于$.Ready()
2014/08/14 Javascript
javascript生成不重复的随机数
2015/07/17 Javascript
canvas红包照片实例分享
2017/02/28 Javascript
js实现简单的获取验证码按钮效果
2017/03/03 Javascript
js实现添加删除表格(两种方法)
2017/04/27 Javascript
解决VUEX刷新的时候出现数据消失
2017/07/03 Javascript
js排序与重组的实例讲解
2017/08/28 Javascript
vue2.0 实现富文本编辑器功能
2019/05/26 Javascript
Vue.js中provide/inject实现响应式数据更新的方法示例
2019/10/16 Javascript
python使用PyFetion来发送短信的例子
2014/04/22 Python
python实现搜索本地文件信息写入文件的方法
2016/02/22 Python
python django 增删改查操作 数据库Mysql
2017/07/27 Python
python 在指定范围内随机生成不重复的n个数实例
2019/01/28 Python
Python 字符串池化的前提
2020/07/03 Python
CSS实现限制字数功能当对象内文本溢出时显示省略标记
2014/08/20 HTML / CSS
迪士尼英国官方商店:shopDisney UK
2019/09/21 全球购物
公司清洁工岗位职责
2013/12/14 职场文书
护士自我鉴定怎么写
2014/02/07 职场文书
餐饮企业总经理岗位职责范文
2014/02/18 职场文书
《守株待兔》教学反思
2014/03/01 职场文书
技术合作协议书范本
2014/04/18 职场文书
民间个人借款协议书
2014/09/30 职场文书
交通安全横幅标语
2014/10/07 职场文书
2014年仓库管理工作总结
2014/12/17 职场文书
银行求职信范文怎么写
2015/03/20 职场文书
重阳节简报
2015/07/20 职场文书
在酒桌上的敬酒词
2015/08/12 职场文书
html实现弹窗的实例
2021/06/09 HTML / CSS
CSS实现隐藏搜索框功能(动画正反向序列)
2021/07/21 HTML / CSS