详解Vue中watch的高级用法


Posted in Javascript onMay 02, 2018

假设有如下代码:

<div>
   <p>FullName: {{fullName}}</p>
   <p>FirstName: <input type="text" v-model="firstName"></p>
</div>

new Vue({
 el: '#root',
 data: {
  firstName: 'Dawei',
  lastName: 'Lou',
  fullName: ''
 },
 watch: {
  firstName(newName, oldName) {
   this.fullName = newName + ' ' + this.lastName;
  }
 } 
})

上面的代码的效果是,当我们输入firstName后,wacth监听每次修改变化的新值,然后计算输出fullName。

handler方法和immediate属性

这里 watch 的一个特点是,最初绑定的时候是不会执行的,要等到 firstName 改变时才执行监听计算。那我们想要一开始就让他最初绑定的时候就执行改怎么办呢?我们需要修改一下我们的 watch 写法,修改过后的 watch 代码如下:

watch: {
 firstName: {
  handler(newName, oldName) {
   this.fullName = newName + ' ' + this.lastName;
  },
  // 代表在wacth里声明了firstName这个方法之后立即先去执行handler方法
  immediate: true
 }
}

注意到handler了吗,我们给 firstName 绑定了一个handler方法,之前我们写的 watch 方法其实默认写的就是这个handler,Vue.js会去处理这个逻辑,最终编译出来其实就是这个handler。

而immediate:true代表如果在 wacth 里声明了 firstName 之后,就会立即先去执行里面的handler方法,如果为 false就跟我们以前的效果一样,不会在绑定的时候就执行。

deep属性

watch 里面还有一个属性 deep,默认值是 false,代表是否深度监听,比如我们 data 里有一个obj属性:

<div>
   <p>obj.a: {{obj.a}}</p>
   <p>obj.a: <input type="text" v-model="obj.a"></p>
</div>

new Vue({
 el: '#root',
 data: {
  obj: {
   a: 123
  }
 },
 watch: {
  obj: {
   handler(newName, oldName) {
     console.log('obj.a changed');
   },
   immediate: true
  }
 } 
})

当我们在在输入框中输入数据视图改变obj.a的值时,我们发现是无效的。受现代 JavaScript 的限制 (以及废弃 Object.observe),Vue 不能检测到对象属性的添加或删除。由于 Vue 会在初始化实例时对属性执行 getter/setter 转化过程,所以属性必须在 data 对象上存在才能让 Vue 转换它,这样才能让它是响应的。

默认情况下 handler 只监听obj这个属性它的引用的变化,我们只有给obj赋值的时候它才会监听到,比如我们在 mounted事件钩子函数中对obj进行重新赋值:

mounted: {
 this.obj = {
  a: '456'
 }
}

这样我们的 handler 才会执行,打印obj.a changed。

相反,如果我们需要监听obj里的属性a的值呢?这时候deep属性就派上用场了!

watch: {
 obj: {
  handler(newName, oldName) {
   console.log('obj.a changed');
  },
  immediate: true,
  deep: true
 }
}

deep的意思就是深入观察,监听器会一层层的往下遍历,给对象的所有属性都加上这个监听器,但是这样性能开销就会非常大了,任何修改obj里面任何一个属性都会触发这个监听器里的 handler。

优化,我们可以是使用字符串形式监听。

watch: {
 'obj.a': {
  handler(newName, oldName) {
   console.log('obj.a changed');
  },
  immediate: true,
  // deep: true
 }
}

这样Vue.js才会一层一层解析下去,直到遇到属性a,然后才给a设置监听函数。

Javascript 相关文章推荐
JavaScript 事件冒泡简介及应用
Jan 11 Javascript
js对象基础实例分析
Jan 13 Javascript
JavaScript中的call方法和apply方法使用对比
Aug 12 Javascript
jQuery平滑旋转幻灯片特效代码分享
Sep 07 Javascript
jQuery CSS3相结合实现时钟插件
Jan 08 Javascript
巧方法 JavaScript获取超链接的绝对URL地址
Jun 14 Javascript
javascript获取网页各种高宽及位置的方法总结
Jul 27 Javascript
JS简单实现禁止访问某个页面的方法
Sep 13 Javascript
jQuery实现带延时功能的水平多级菜单效果【附demo源码下载】
Sep 21 Javascript
BootStrap selectpicker后台动态绑定数据
Jun 01 Javascript
详解如何将 Vue-cli 改造成支持多页面的 history 模式
Nov 20 Javascript
微信小程序中插入激励视频广告并获取收益(实例代码)
Dec 06 Javascript
Vue.js中关于侦听器(watch)的高级用法示例
May 02 #Javascript
Vue SSR 组件加载问题
May 02 #Javascript
基于jquery实现左右上下移动效果
May 02 #jQuery
关于Vue在ie10下空白页的debug小结
May 02 #Javascript
解析Json字符串的三种方法日常常用
May 02 #Javascript
使用vue-cli创建项目的图文教程(新手入门篇)
May 02 #Javascript
vue中的模态对话框组件实现过程
May 01 #Javascript
You might like
PHP5 的对象赋值机制介绍
2011/08/02 PHP
php并发对MYSQL造成压力的解决方法
2013/02/21 PHP
PHP中使用FFMPEG获取视频缩略图和视频总时长实例
2014/05/04 PHP
PHP 范围解析操作符(::)用法分析【访问静态成员和类常量】
2020/04/14 PHP
myFocus slide3D v1.1.0 使用方法与下载
2011/01/12 Javascript
jQuery EasyUI API 中文文档 - Spinner微调器使用
2011/10/21 Javascript
jquery实现图片渐变切换兼容ie6/Chrome/Firefox
2013/08/02 Javascript
鼠标移入移出事件改变图片的分辨率的两种方法
2013/12/17 Javascript
二叉树的非递归后序遍历算法实例详解
2014/02/07 Javascript
Nodejs全局安装和本地安装的不同之处
2016/07/04 NodeJs
BootStrap入门教程(三)之响应式原理
2016/09/19 Javascript
JQuery 封装 Ajax 常用方法(推荐)
2017/05/21 jQuery
select获取下拉框的值 下拉框默认选中方法
2018/02/28 Javascript
详解webpack-dev-server 设置反向代理解决跨域问题
2018/04/18 Javascript
vue 中的keep-alive实例代码
2018/07/20 Javascript
Bootstrap Table实现定时刷新数据的方法
2018/08/13 Javascript
JS监听事件的叠加和移除功能
2018/11/19 Javascript
利用d3.js力导布局绘制资源拓扑图实例教程
2019/01/08 Javascript
微信小程序基于canvas渐变实现的彩虹效果示例
2019/05/03 Javascript
JS对象属性的检测与获取操作实例分析
2020/03/17 Javascript
uniapp 仿微信的右边下拉选择弹出框的实现代码
2020/07/12 Javascript
Javascript 模拟mvc实现点餐程序案例详解
2020/12/24 Javascript
[02:20]DOTA2亚洲邀请赛 EHOME战队出场宣传片
2015/02/07 DOTA
使用Python的Twisted框架编写简单的网络客户端
2015/04/16 Python
浅谈django中的认证与登录
2016/10/31 Python
python3中zip()函数使用详解
2018/06/29 Python
Python函数和模块的使用总结
2019/05/20 Python
美国购买汽车零件网站:Buy Auto Parts
2018/04/02 全球购物
英国高街奥特莱斯:Highstreet Outlet
2019/11/21 全球购物
优秀毕业生自荐信范文
2014/01/01 职场文书
护士演讲稿范文
2014/01/05 职场文书
《她是我的朋友》教学反思
2014/04/26 职场文书
环保倡议书格式范文
2014/05/14 职场文书
公务员年终个人总结
2015/02/12 职场文书
创业计划书之服装
2019/10/07 职场文书
Win11更新失败并提示0xc1900101
2022/04/19 数码科技