详解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监听浏览器的问题
Jun 23 Javascript
基于jquery实现图片广告轮换效果代码
Jul 07 Javascript
Jquery 模板数据绑定插件的使用方法详解
Jul 08 Javascript
Jquery api 速查表分享
Jan 12 Javascript
JavaScript中使用Math.PI圆周率属性的方法
Jun 14 Javascript
分享12个非常实用的JavaScript小技巧
May 11 Javascript
完美解决浏览器跨域的几种方法(汇总)
May 08 Javascript
详解VUE 对element-ui中的ElTableColumn扩展
Mar 28 Javascript
vue项目中使用百度地图的方法
Jun 08 Javascript
Vue中使用clipboard实现复制功能
Sep 05 Javascript
layui 实现表格某一列显示图标
Sep 19 Javascript
axios实现文件上传并获取进度
Mar 25 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
解析Win7 XAMPP apache无法启动的问题
2013/06/26 PHP
PHP生成推广海报的方法分享
2018/04/22 PHP
支持ie与FireFox的剪切板操作代码
2009/09/28 Javascript
将html页面保存成图片,图片写入pdf的实现方法(推荐)
2016/09/17 Javascript
AngularJS通过$location获取及改变当前页面的URL
2016/09/23 Javascript
Nodejs+Socket.io实现通讯实例代码
2017/02/13 NodeJs
详解webpack 如何集成第三方js库
2017/06/29 Javascript
Bootstrap Table 在指定列中添加下拉框控件并获取所选值
2017/07/31 Javascript
微信小程序实现之手势锁功能实例代码
2018/07/19 Javascript
jQuery中常用动画效果函数知识点整理
2018/08/19 jQuery
解决node-sass偶尔安装失败的方法小结
2018/12/05 Javascript
JavaScript惰性载入函数实例分析
2019/03/27 Javascript
详解微信小程序调用支付接口支付
2019/04/28 Javascript
小程序中的箭头函数的具体使用
2020/06/19 Javascript
vue实现页面切换滑动效果
2020/06/29 Javascript
Element Notification通知的实现示例
2020/07/27 Javascript
js实现简单抽奖功能
2020/11/24 Javascript
ant-design-vue中的select选择器,对输入值的进行筛选操作
2020/10/24 Javascript
[58:23]LGD vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
python实现简单购物商城
2016/05/21 Python
python将文本中的空格替换为换行的方法
2018/03/19 Python
Django中使用session保持用户登陆连接的例子
2019/08/06 Python
pytorch实现特殊的Module--Sqeuential三种写法
2020/01/15 Python
Django 再谈一谈json序列化
2020/03/16 Python
pycharm解决关闭flask后依旧可以访问服务的问题
2020/04/03 Python
HTML5 文件上传下载的实例代码
2017/07/03 HTML / CSS
localStorage、sessionStorage使用总结
2017/11/17 HTML / CSS
vivo智能手机官方商城:vivo
2016/09/22 全球购物
Luxplus丹麦:香水和个人护理折扣
2018/04/23 全球购物
美国时尚假发购物网站:Wigsbuy
2019/04/06 全球购物
军训考核自我鉴定
2014/02/13 职场文书
《植物妈妈有办法》教学反思
2014/02/25 职场文书
爱国演讲稿500字
2014/05/04 职场文书
优秀校长事迹材料
2014/12/24 职场文书
党章学习心得体会2016
2016/01/14 职场文书
什么是Python装饰器?如何定义和使用?
2022/04/11 Python