vue.js 之 watch 详解
接我上篇博客的例子:

在上面代码中,当我们修改 firstName 或 lastName 后,watch 监听每次修改变化的新值,然后计算输出 fullName;此时 watch 的一个缺点是,最初绑定的时候是不会执行的,要等到 firstName 或 lastName 改变时才执行监听计算。
那么当我们想要一开始就让他最初绑定的时候就执行怎么办呢?此时我们就需要改写一下 watch 方法,如下(immediate:true 属性):

我们可以看到,在此处多了一个 handler 方法,之前我们写的 watch 方法其实默认写的就是这个 handler,vue.js 会去处理这个逻辑,最终编译出的其实就是这个 handler;
而 immediate:true 代表如果在 watch 里声明了 firstName 或 lastName 之后,就会立即先去执行里面的 handler 方法,如果为 false 就跟我们之前的效果不一样,不会在绑定的时候执行。
deep属性
watch 里面还有一个属性 deep,默认值是 false,代表是否深度监听,一般用于深度监听对象属性;
实际场景展现:当我们要监听data 里面的对象属性时;

场景分析:当我们在输入框中输入数据试图改变 object.aaa 的值时,我们发现是无效的。受现代 Javascript 的限制(以及废弃 Object.observe),Vue 不能检测到对象属性的添加或删除。由于 Vue 会在初始化实例时对属性执行 getter/setter 转化过程,所以属性必须在 data 对象上存在才能让 vue 转换它,这样才能让它是响应的。
默认情况下 handler 只监听 object 这个属性它的引用的变化,我们只有给 object 赋值的时候它才会监听到,比如我们在 mounted 事件钩子函数中对 object 进行重新赋值:

只有在 mounted 事件钩子中重新对对象属性赋值时,才会触发 watch 里面的 handler 方法,打印出 object.aaa changed;上面方法只适用于监听整个对象发生变化的场景;
那如果当我们需要监听 object 里的属性 aaa 的值时,此时 deep 属性就派上用场了~

deep:true 的意思就是深入观察,监听器会一层层的往下遍历,给对象的所有属性都加上整个监听器,但是这样性能开销就会非常大了,任何修改 object 里面任何一个属性都会触发整个监听器里的 handler。当然,为了性能优化,我们可以是使用字符串形式监听,这样 vue.js 才会一层一层解析下去,直到遇到属性 aaa ,然后才给 a 设置监听函数;优化后代码如下:

合理运用watch监听路由(我们可以使用 watch 来进行路由的监听):

注销watch
为什么要注销 watch ?因为我们的组件是经常要被销毁的,比如我们跳一个路由,从一个页面跳到另一个页面,那么原来的页面的 watch 其实就没用了,这时候我i没呢应该注销掉原来页面的 watch 的,不然的话可能会导致内置溢出。不过我们平时 watch 都是写在组件的选项中的,他会随着组件的销毁而销毁;
但是,如果我们使用下面这样的方式写 watch ,那么就要手动注销了,这种注销其实也很简单

vue.js 之 watch 详解的更多相关文章
- Vue.js 数据绑定语法详解
Vue.js 数据绑定语法详解 一.总结 一句话总结:Vue.js 的模板是基于 DOM 实现的.这意味着所有的 Vue.js 模板都是可解析的有效的 HTML,且通过一些特殊的特性做了增强.Vue ...
- vue.js自定义指令详解
写在文本前:相信在做vue的项目,你肯定接触了指令,我们常用vue内置的一些指令,比如v-model,v-text,v-if,v-show等等,但是这些内置指令不在本文的讲解范畴,本文想说的是其自定义 ...
- Vue组件通信方式全面详解
vue组件通信方式全面详解 众所周知,Vue主要思想就是组件化开发.因为,在实际的项目开发中,肯定会以组件的开发模式进行.形如页面和页面之间需要通信一样,Vue 组件和组件之间肯定也需要互通有无.共享 ...
- 《Node.js开发实战详解》学习笔记
<Node.js开发实战详解>学习笔记 ——持续更新中 一.NodeJS设计模式 1 . 单例模式 顾名思义,单例就是保证一个类只有一个实例,实现的方法是,先判断实例是否存在,如果存在则直 ...
- Js apply 方法 详解
Js apply方法详解 我在一开始看到JavaScript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这 ...
- ES6,ES2105核心功能一览,js新特性详解
ES6,ES2105核心功能一览,js新特性详解 过去几年 JavaScript 发生了很大的变化.ES6(ECMAScript 6.ES2105)是 JavaScript 语言的新标准,2015 年 ...
- Js apply()使用详解
Js apply方法详解 我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这 ...
- Js apply方法详解,及其apply()方法的妙用
Js apply方法详解 我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这 ...
- JS hashMap实例详解
链接:http://www.jb51.net/article/85111.htm JS hashMap实例详解 作者:囧侠 字体:[增加 减小] 类型:转载 时间:2016-05-26我要评论 这篇文 ...
随机推荐
- Atitit s2018.5 s5 doc list on com pc.docx Acc 112237553.docx Acc baidu netdisk.docx Acc csdn 18821766710 attilax main num.docx Atiitt put post 工具 开发工具dev tool test.docx Atiitt 腾讯图像分类相册管家.docx
Atitit s2018.5 s5 doc list on com pc.docx Acc 112237553.docx Acc baidu netdisk.docx Acc csdn 1882 ...
- 《Essential C++》读书笔记 之 目录导航
<Essential C++>读书笔记 之 目录导航 2014-07-06 第一章:<Essential C++>读书笔记 之 C++编程基础 第二章:<Essentia ...
- RabbitMQ内存爆出
RabbitMQ升级到3.6.1版本后,随着业务和系统功能的增加,出现RabbitMQ内存陡增直至服务宕掉的情况.内存增加时,在management管理控制台上可以见到如下警告: The manage ...
- opencv wlsfilter depth refinement demo
参考 https://docs.opencv.org/3.2.0/d3/d14/tutorial_ximgproc_disparity_filtering.html // This file is p ...
- Ubuntu 16.04 ROS环境配置
最近新入职一家公司,是搞智能无人驾驶的,用的操作系统是Ubuntu和ros,之前没接触过ros系统,既然公司用那就必须的学习啊,话不多说先装它一个ros玩玩... 1. Ubuntu 安装 ROS K ...
- 通用 正则表达式 C# (.NET)Regex 总结
[参考]C#正则表达式Regex类的用法 语法: 1. new System.Text.RegularExpressions.Regex("\\$\\d{1,2}\\}"). ...
- Postman-REST-Client_v0.8.1之chrome插件下载
一.前言 安装chrome浏览器postman-rest-client插件,实现基于资源RestFul的http协议的GET.POST.DELETE.PUT等方式请求调用,具体安装使用步骤如下所示 二 ...
- 群晖搭建webssh
拷贝工程到系统根,然后需要赋予权限 sudo chmod 777 -R WebSSH2/ git clone https://github.com/zhaocundang/WebSSH2.git de ...
- Android利用Mediapalyer播放本地资源文件声音
首先在res下创建raw,然后将mp3音乐拷贝到raw下 直接贴代码吧 //开始播放声音 public class PlayVoice { private static MediaPlayer med ...
- 使用cnpm 安装vue.js
前提已经安装了node.js 一.临时使用 1.npm install -g cnpm --registry=https://registry.npm.taobao.org 2.cnpm instal ...