1. 什么是watch选项?(官方解释)

  • 类型:{ [key: string]: string | Function | Object | Array }
  • 详细:一个对象,键是需要观察的表达式,值是对应回调函数。值也可以是方法名,或者包含选项的对象。Vue 实例将会在实例i化时调用 $watch(),遍历 watch 对象的每一个属性。

2. 通俗解释

  • watch选项能够监听值的变化。

3. 简单使用

<div><p>Number: {{ myNumber }}</p><p>Number: <input type="text" v-model.number="myNumber"></p>
</div>new Vue({el: '#root',data: {myNumber: 'Dawei'},watch: {myNumber(newVal, oldVal) {console.log('newVal', newVal);console.log('oldVal', oldVal);}}
})

根据上面的代码,在输入框输入内容,控制台会显示新值还有旧值。

4. handler方法和immediate属性

根据上面的例子我们加以改造

<div><p>Number: {{ myNumber }}</p><p>Number: <input type="text" v-model.number="myNumber"></p>
</div>new Vue({el: '#root',data: {myNumber: 'Dawei'},watch: {myNumber: {handler(newVal, oldVal) {console.log('newVal', newVal);console.log('oldVal', oldVal);},immediate: true}}
})
  • handler方法就是你watch中需要具体执行的方法;
  • immediate为true时则立即触发回调函数;如果为false,则和上面的例子一样,不会立即执行回调。

5. deep属性

上面两个例子都是监听简单数据类型的数据,对于对象或者对象中的属性,我们如何监听?那么就介绍deep属性。它的作用就是解决这个问题的关键。

<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: ''}},watch: {'obj': {handler(newVal, oldVal) {console.log('newVal-obj.a', obj.a);console.log('oldVal-obj.b', obj.a);},deep: true}}
})

deep顾名思义就是深入监听,也就是在对象中层层遍历,并在监听对象上的每一个属性上都添加监听,固然也会损耗性能。

6. 注销监听

在第五点后面我提到了损耗性能,但对于组件开发的情况下是不存在,监听事件会随着组件的销毁而销毁。而在组件外声明的监听事件,我们需要使用unWatch方法注销,防止内存溢出。

7. 监听的多种写法(只介绍常用的两种)

// 第一种
<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: ''}},watch: {obj: { // <--重点看这里handler(newVal, oldVal) {console.log('newVal-obj.a', obj.a);console.log('oldVal-obj.b', obj.a);},deep: true}}
})// 第二种<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: ''}},watch: {'obj.a': { // <--重点看这里handler(newVal, oldVal) {console.log('newVal-obj.a', obj.a);console.log('oldVal-obj.b', obj.a);},deep: true}}
})

8. 特别注意

  1. ES6中推出了箭头函数,上述例子我均未使用箭头函数,如果在handler函数中使用了箭头函数,改变了this指向,就无法获取到Vue实例,则为undifined。
  2. 对于父子组件传参,异步获取数据有时会存在获取不到值的情况。这时候watch就派上用场,适当的时候要配合immediate或者deep属性配合使用。

9. 源码解析

// state.jsfunction createWatcher (vm: Component,expOrFn: string | Function,handler: any,options?: Object
) {if (isPlainObject(handler)) {options = handlerhandler = handler.handler}if (typeof handler === 'string') {handler = vm[handler]}return vm.$watch(expOrFn, handler, options)
}

Vue的类初始化建立数据绑定时,会从用户传的参数来判断拿什么来做监听的数据变量,拿什么来当作监听到数据变更后的处理函数。因为在变量你传了一个对象,这个对象就是createWatcher函数参数中对应的handler,函数第一步逻辑就是判断它是不是一个对象,如果是对象,就拿它里面的handler参数来作为监听事件的处理函数。

Vue——watch选项详解相关推荐

  1. Vue组件-Confirm详解

    Vue组件-Confirm详解 原作者:爱扎马尾的小狮子 一.使用的地方引用,传入属性和方法 在需要的地方引入组件,然后传入对应的属性和方法 组件 <template> <div : ...

  2. 一篇由简到难的 Vue 面试题+详解答案

    作者:Big shark@LX 原文:https://juejin.cn/post/6961222829979697165 前言 本文整理了「高频」出现的 Vue 相关面试题并且附带「详解答案」 难度 ...

  3. 最全最详细前端vue面试题+详解答案(拿到高薪offer不是梦)

    最全vue面试题+详解答案 1.MVC 和 MVVM 区别 MVC MVC全名是 Model View Controller,时模型 - 视图 - 控制器的缩写,一种软件设计典范. Model(模型) ...

  4. 【面试题】973- 一篇由简到难的 Vue 面试题+详解答案

    作者:Big shark@LX 原文:https://juejin.cn/post/6961222829979697165 前言 本文整理了「高频」出现的 Vue 相关面试题并且附带「详解答案」 难度 ...

  5. 最全的 Vue 面试题+详解答案

    前言 本文整理了高频出现的 Vue 相关面试题并且附带详解答案 难度分为简单 中等 困难 三种类型 大家可以先不看答案自测一下自己的 Vue 水平哈 如果对原理感兴趣的同学 欢迎查看小编的手写 Vue ...

  6. WPD:Page Download Time Breakdown选项详解

    WPD:Page Download Time Breakdown选项详解 "页面下载时间细分"图显示每个页面组件下载时间的细分,可以根据它确定在网页下载期间事务响应时间缓慢是由网络 ...

  7. kernel 选项详解(stlinux2.3) 2-2

    kernel 选项详解(stlinux2.3) 2-2 []IP:TCP syncookie support(disabled per default)    //TCP cookie同步支持(默认关 ...

  8. selenium工具启动Chrome浏览器时配置选项详解

    mb62abf3afb54fb2022-06-18 00:02:10 文章标签chromechrome浏览器加载文章分类虚拟化云计算阅读数1473 前言 1. Chromeoptions 是Chrom ...

  9. Ffmpeg快速命令使用 Ffmpeg选项详解 Ffmepg格式详解 常见视频文件格式详解

    http://www.ffmpeg.com.cn/index.php/%E9%A6%96%E9%A1%B5 Ffmpeg快速命令使用 From Ffmpeg工程组 Jump to: navigatio ...

最新文章

  1. 虚拟机 pxe服务器,配置PXE安装ESXi主机
  2. IsWow64的真实用途
  3. Druid:一个用于大数据实时处理的开源分布式系统——大数据实时查询和分析的高容错、高性能开源分布式系统...
  4. SVN和Git的比较
  5. Apache Flink在 bilibili 的多元化探索与实践
  6. micropython按键控制流水灯_【micro:bit Micropython】The LED Display(1)控制像素点
  7. Computer Vision News
  8. python一行包含if else需要注意的点
  9. 没有ajax以前的隐藏 iframe 技术
  10. 高性能集群软件Keepalived之安装配置篇
  11. Understanding LSTM Networks(理解LSTM网络-colah‘s blog)
  12. linux运行j2me,Linux下用Eclipse搭建J2me开发环境过程
  13. Spring Cloud 各个版本之间的区别
  14. Thinkphp5.0实战 仿百度糯米开发多商家电商平台视频中常见的命令(正在更新)
  15. FortiGate防火墙配置SSL用户分流
  16. 教室预约APP系统(基于uni-app框架)毕业设计毕业论文开题报告参考(1)系统功能
  17. 剑指 Offer 12. 矩阵中的路径
  18. Avira Free Antivirus 小红伞免费杀毒软件广告去除工具
  19. 删除链接到WLW清单文件
  20. RuilongMaker ESP8266物联网开发板 串口WIFI模块无线收发 Mini版

热门文章

  1. 量子计算机多可怕,量子力学有多可怕?
  2. 最终服务器的信息接收及响应,ehlo详解
  3. rebuild node-sass npm install
  4. android手机上的返回键和home键
  5. Python基础 by.肖洪福
  6. 【转载】Excel操作 Microsoft.Office.Interop.Excel.dll的使用
  7. EBP与ESP的作用
  8. miui资源全集K60 K50 k40 k30 K20 小米14 小米13 小米12 小米11-小米6
  9. PHP SQL 注入攻击的技术实现以及预防办法
  10. FLINK 极客时间