FullName: {{fullName}}

FirstName:

newVue({

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属性:

obj.a: {{obj.a}}

obj.a:

newVue({

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设置监听函数。

注销watch

为什么要注销 watch?因为我们的组件是经常要被销毁的,比如我们跳一个路由,从一个页面跳到另外一个页面,那么原来的页面的 watch 其实就没用了,这时候我们应该注销掉原来页面的 watch 的,不然的话可能会导致内置溢出。好在我们平时 watch 都是写在组件的选项中的,他会随着组件的销毁而销毁。

const app = newVue({

template:'

{{text}}

',

data: {

text:0},

watch: {

text(newVal, oldVal){

console.log(`${newVal} : ${oldVal}`);

}

}

});

但是,如果我们使用下面这样的方式写 watch,那么就要手动注销了,这种注销其实也很简单

const unWatch = app.$watch('text', (newVal, oldVal) =>{

console.log(`${newVal} : ${oldVal}`);

})

unWatch();//手动注销watch

app.$watch调用后会返回一个值,就是unWatch方法,你要注销 watch 只要调用unWatch方法就可以了。

2.watch监听路由

我们可以使用watch来进行路由的监听

watch: {

changeShowType(value) {

console.log("-----"+value);

},'$route'(to,from){

console.log(to);//to表示去往的界面

console.log(from); //from表示来自于哪个界面

if(to.path=="/shop/detail"){

console.log("商品详情");

}

}

},

vue watch 经常监听不到_Vue.js中 watch(深度监听)的最易懂的解释相关推荐

  1. Vue.js中 watch(深度监听-deep)原理以及详解

    handler方法和immediate属性 这里 watch 的一个特点是,最初绑定的时候是不会执行的,要等到 firstName 改变时才执行监听计算.那我们想要一开始就让他最初绑定的时候就执行改怎 ...

  2. vue在created调用点击方法_vue.js中created方法的使用详解

    这次给大家带来vue.js中created方法的使用详解,使用vue.js中created方法的注意事项有哪些,下面就是实战案例,一起来看一下. 这是它的一个生命周期钩子函数,就是一个vue实例被生成 ...

  3. vue 怎么在html显示为回车_vue.js中怎么换行?

    vue.js中怎么换行?下面本篇文章给大家介绍一下.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. 在页面中经常会遇到自定义文本,如果文本过长就需要换行,在HTML中可以通过 标签换 ...

  4. vue中如何深度监听一个对象?

    大家都知道,Vue项目中对数据的监听,提供了一个很好的钩子watch,watch可以极其方便的监听我们常用数据类型值的变化,但通常当我们想监听一个对象中,某个属性值的变化时,很难达到我们预期的效果.那 ...

  5. vue 懒人_Vue.js 中的实用工具方法【推荐】

    收集日常开发中常用到的一些工具方法, 包含 vue 的公用过滤器.公用指令等 (PS: 懒人养成记) 公用自定义过滤器 import Vue from 'vue' import moment from ...

  6. vue使用高德地图画电子围栏_Vue.js 中使用高德地图定位及渲染地图

    看了github上面有集成的高德地图组件,但由于项目所要用到的不多,所以决定跟着文档写一写.运行环境是vue-cli webpack 引入高德地图 一般用使用vue-cli webpack最简单粗暴的 ...

  7. watch中的深度监听

    watch 用于观察一个表达式或computed函数在Vue.js实例上的变化.回调函数调用时会从参数得到新数据(new value)和旧数据(old value).表达式只接受以点分割的路径,例如o ...

  8. Angular.js中使用$watch监听模型变化

    $watch简单使用 $watch是一个scope函数,用于监听模型变化,当你的模型部分发生变化时它会通知你. $watch(watchExpression, listener, objectEqua ...

  9. vue watch 修改滚动条_Vue.js 中滚动条始终定位在底部的方法

    Vue.js 中滚动条始终定位在底部的方法 发布于 2020-2-23| 复制链接 分享一篇关于vue 中滚动条始终定位在底部的方法,具有很好的参考价值,希望对大家有所帮助.一起跟随小妖过来看看吧 滚 ...

最新文章

  1. hadoop fs命令无法使用_「大数据」「Hadoop」HDFS的配置与管理
  2. 数据集增广 之 多个图片贴到一张图上,以及生成相应的json文件
  3. SpringBatch 多线程(TaskExecutor)启动Job详解 (七)
  4. qt 设置串口起始位_【IT专家】Qt:如何设置主窗口的初始位置?
  5. 学习有向图和无向图的强连通分量(基本概念+割点+点双联通分量+桥+边双连通分量+全套模板【Tarjan】)
  6. 505B. Mr. Kitayuta‘s Colorful Graph
  7. leveldb java实例_EZDB首页、文档和下载 - LevelDB 的 Java 封装 - OSCHINA - 中文开源技术交流社区...
  8. openSUSE 安装 Torch
  9. java webservice 示例,Java webservice 示例
  10. 毕业论文页码与目录自动生成
  11. 路由器服务器修改密码,TP-Link TL-WR842N路由器设置密码
  12. linux格式化后恢复 vmdk恢复,根据flat.vmdk文件恢复磁盘(完善版)
  13. 王者荣耀安卓区修改荣耀战区方法 | 最低战力查询(附带视频与安装包)
  14. 转载:CAN:CAN矩阵、CAN网络、DBC、MDF关系
  15. 点云配准之NDT算法
  16. Required field ‘serverProtocolVersion‘ is unset! User: root is not allowed to impersonate root
  17. h3c交换机绑定在线计算机的命令,H3C 3100交换机怎么IP绑定MAC
  18. CSS3学习笔记三---怪异盒模型 | 弹性盒*
  19. python使用selenium模块实现火车票的自动购买
  20. 小米与360的智能硬件用户之争

热门文章

  1. 微信小程序 android内存暂用,微信小程序与手机APP占用内存 流量消耗对比介绍
  2. java小区管理的项目描述,基于jsp的小区信息管理-JavaEE实现小区信息管理 - java项目源码...
  3. using 关键字有两个主要用途
  4. ElasticSearch(二十四)基于scoll技术滚动搜索大量数据
  5. 如何通过TortoiseGit(小乌龟)把本地项目上传到github上
  6. odoo中页面跳转相关
  7. ASP.net Web API综合示例
  8. Entity Framework ---初见
  9. win7下vs2008如何进行注册?
  10. 入侵检测系统的性能的辨别(3)