1 简介

  所谓监听就是对内置对象的状态或者属性变化进行监听并且做出反应的响应,监听属性,意思就是可以监视其他数据的变化

2 使用

  使用watch配置项,在配置项里面写上要监视的属性,每次属性值的变化都会触发handler函数回调,也可以监视计算属性的变化

2.1 语法格式

  其中,属性名表示监视的data里面的属性或者计算属性里面的属性

  handler是监视回调的方法,它有两个参数:新的值和旧的值

  配置项:可以配置也可以不配置

watch:{
属性名:{
handler(newValue,oldValue){
console.log('新值:'+newValue + "---旧值:"+oldValue)
},
配置项:值,
配置项:值
}
}

2.2 简写格式

  当只有handler回调函数而没有其他配置项的时候,可以简写成下面格式

watch:{
属性名(newValue,oldValue){
console.log('新值:'+newValue + "---旧值:"+oldValue)
}
}

2.3 示例1-没有其他配置项

<body>

    <div id="root">
<input v-model="name"></input> <br/><br/>
<input v-model="address" ></input> <br/>
</div> <script type="text/javascript" > const vm = new Vue({
el:'#root',
data:{
name:'历史',
address:'杭州'
},
watch:{
name(newValue,oldValue){
console.log('新值:'+newValue + "---旧值:"+oldValue)
}
}
}) </script>
</body>

如下图,初始化的时候,监视方法没有调用

如下图,在修改第一个name输入框的时候,监视方法调用了

2.4 示例2 添加配置项 immediate

  immediate,默认值是false,设置为true时,在被监视的值初始化的时候调用一次监视函数

<body>

    <div id="root">
<input v-model="name"></input> <br/><br/>
<input v-model="address" ></input> <br/>
</div> <script type="text/javascript" > const vm = new Vue({
el:'#root',
data:{
name:'历史',
address:'杭州'
},
watch:{
name:{
immediate:true,
handler(newValue,oldValue){
console.log('新值:'+newValue + "---旧值:"+oldValue)
}
}
}
}) </script>
</body>

如下图,在初始化的时候,监视方法就调用了。且发现旧值是undifined,因为只没有改变过,所以没有旧值,就是undifined了

3 深度监视

3.1 示例1 监视的属性是个对象

  监视person这个属性,它是个对象

<body>

    <div id="root">
<input v-model="name"></input> <br/><br/>
<input v-model="address" ></input> <br/>
<h1>{{person}}</h1>
</div> <script type="text/javascript" > const vm = new Vue({
el:'#root',
data:{
name:'历史',
address:'杭州',
person:{
sex:'男',
age:20
}
},
watch:{
person:{
immediate:true,
handler(newValue,oldValue){
console.log('新值:'+newValue + "---旧值:"+oldValue)
}
}
}
}) </script>
</body>

如下图,我们去修改person.age和person.sex的时候,发现监视方法没有被调用。只有使用一个新的对象替换原对象的时候,监视方法才调用了

因为,被监视的属性是对象的时候,它监视的是整个对象。可以理解为被监视的这个属性持有的值实际上是对象的地址,所以监视的时候实际上是在监视这个地址有没有发生变化

3.2 监视对象中某个属性

  监视person的age属性

  注意:watch里面'person.age'需要加上引号。虽然我们平时写这些属性都可以不加引号,实际上是vue给我们自动加上了,但是在这里需要我们自己手动写上引号

<body>

    <div id="root">
<input v-model="name"></input> <br/><br/>
<input v-model="address" ></input> <br/>
<h1>{{person}}</h1>
</div> <script type="text/javascript" > const vm = new Vue({
el:'#root',
data:{
name:'历史',
address:'杭州',
person:{
sex:'男',
age:20
}
},
watch:{
'person.age':{
immediate:true,
handler(newValue,oldValue){
console.log('新值:'+newValue + "---旧值:"+oldValue)
}
}
}
}) </script>
</body>

如下图,修改person.age时监视方法发生变化

3.3 监视对象的所有属性 配置项deep

  deep:是否进行深度监视,默认false,配置为true,深度监视对象里面每个属性(包括多个层级)

<body>

    <div id="root">
<input v-model="name"></input> <br/><br/>
<input v-model="address" ></input> <br/>
<h1>{{person}}</h1>
</div> <script type="text/javascript" > const vm = new Vue({
el:'#root',
data:{
name:'历史',
address:'杭州',
person:{
sex:'男',
age:20,
house:{
'size':'120',
'floor':12
}
}
},
watch:{
person:{
immediate:true,
deep:true,
handler(newValue,oldValue){
console.log('新值:'+newValue + "---旧值:"+oldValue)
}
}
}
}) </script>
</body>

  如下图,修改person.age和person.house.floor,监视方法都会被调用

4 监视属性和计算属性的区别

  1)computed能实现的,watch都能实现,computed不能实现的,watch也能实现

  2)计算属性不能执行异步任务。计算属性一般不会用来向服务器请求或者执行异步任务(如setTimeOut),因为耗时可能会比较长,我们的计算属性要实时更新。所以这个异步任务就可以用监听属性来做

4.1 示例

  我们要实现下面这个标题的值是两个输入框的值的拼接

  分别使用监视属性和计算属性实现

4.1.1 监视属性实现

<body>

    <div id="root">
<input v-model="name"></input> <br/><br/>
<input v-model="address" ></input> <br/>
<h1>{{nameAndAddress}}</h1>
</div> <script type="text/javascript" > const vm = new Vue({
el:'#root',
data:{
name:'历史',
address:'杭州',
nameAndAddress:''
}
,
watch:{
name:{
immediate:true,
handler(newValue,oldValue){
this.nameAndAddress = this.name + this.address
}
},
address:{
immediate:true,
handler(newValue,oldValue){
this.nameAndAddress = this.name + this.address
}
}
}
}) </script>
</body>

4.1.2 计算属性实现

<body>

    <div id="root">
<input v-model="name"></input> <br/><br/>
<input v-model="address" ></input> <br/>
<h1>{{nameAndAddress}}</h1>
</div> <script type="text/javascript" > const vm = new Vue({
el:'#root',
data:{
name:'历史',
address:'杭州'
},
computed:{
nameAndAddress(){
return this.name+this.address
}
}
}) </script>
</body>

4.2 示例2

  在上面的基础上,要求两个输入框的值变化时,标题的值要延迟2秒后再变化

4.2.1 监视属性

  注意setTimeout里面写的是箭头函数,这样子它就没有自己的this,this往外层找,就能找到vm对象

<body>

    <div id="root">
<input v-model="name"></input> <br/><br/>
<input v-model="address" ></input> <br/>
<h1>{{nameAndAddress}}</h1>
</div> <script type="text/javascript" > const vm = new Vue({
el:'#root',
data:{
name:'历史',
address:'杭州',
nameAndAddress:''
}
,
watch:{
name:{
immediate:true,
handler(newValue,oldValue){
console.log('111')
setTimeout(()=>{
this.nameAndAddress = this.name + this.address
},2000) }
},
address:{
immediate:true,
handler(newValue,oldValue){
console.log('111')
setTimeout (()=>{
this.nameAndAddress = this.name + this.address
},2000) }
}
}
}) </script>
</body>

4.2.2 计算属性

<body>

    <div id="root">
<input v-model="name"></input> <br/><br/>
<input v-model="address" ></input> <br/>
<h1>{{nameAndAddress}}</h1>
</div> <script type="text/javascript" > const vm = new Vue({
el:'#root',
data:{
name:'历史',
address:'杭州'
},
computed:{
nameAndAddress(){
setTimeout(()=>{
this.name+this.address
},2000) }
}
}) </script>
</body>

如下图,我们发现标题压根没有值。

我们要知道,计算属性的值依赖的是getter函数的返回值。

如下图这么编码,计算属性nameAndAddress是没有返回值的,也就是它的getter函数式没有返回值的,所以该计算属性就没有值

nameAndAddress(){
setTimeout(()=>{
this.name+this.address
},2000) }

它只能下面这么编码,但是这样子又不能实现等2秒的效果

nameAndAddress(){
setTimeout(()=>{
this.name+this.address
},2000)
return this.name+this.address
}

4.3 注意细节

  在vue示例里面,所有被vue管理的函数,全部写成普通函数,这样子this就可以获取到vm对象或者组件对象

  所有不被vue管理的函数,最好写成箭头函数,这样子this就可以获取到vm对象或者组件对象

<body>
    <div id="root">
     <input v-model="name"></input> <br/><br/>
     <input v-model="address" ></input> <br/>
    </div>
   
    <script type="text/javascript" >
   
     const vm = new Vue({
      el:'#root',
      data:{
       name:'历史',
       address:'杭州'
      },
      watch:{
        name:{
          handler(newValue,oldValue){
            console.log('新值:'+newValue + "---旧值:"+oldValue)
          }
        }
      }
     })
   
     </script>
    </body>

Vue12 监视属性的更多相关文章

  1. Vue的计算属性,监视属性代码理解

    1.计算属性:在computed属性对象中定义计算属性的方法,在页面中使用{{方法名}}来显示计算的结果 //计算属性 computed:{ // 计算属性值的一个方法,方法的返回值是属性值,初始化显 ...

  2. vue的计算和监视属性,附一小实例

    1. 计算属性 在computed属性对象中定义计算属性的方法 在页面中使用{{方法名}}来显示计算的结果 2. 监视属性: 通过通过vm对象的$watch()或watch配置来监视指定的属性 当属性 ...

  3. Vue 计算属性 && 监视属性

    1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8" /> 5 & ...

  4. Vue学习之--------监视属性(2022/7/10)

    文章目录 1.监视属性 1.1 监视属性--天气案例 1.1.1 基础知识 1.1.2 代码实例 1.1.2 测试效果 1.2 深度监视-天气案例 1.2.1 基础知识 1.2.2 代码实例 1.2. ...

  5. VUE:计算属性和监视

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. (尚004)Vue计算属性之基本使用和监视

    所做效果预览: test004.html <!DOCTYPE html><html lang="en"><head> <meta char ...

  7. 使用属性动画 — Property Animation

    属性动画,就是通过控制对象中的属性值产生的动画.属性动画是目前最高级的2D动画系统. 在API Level 11中添加.Property Animation号称能控制一切对象的动画,包括可见的和不可见 ...

  8. iOS开发Swift篇—(九)属性

    iOS开发Swift篇—(九)属性 一.类的定义 Swift与Objective-C定义类的区别 Objective-C:一般需要2个文件,1个.h声明文件和1个.m实现文件 Swift:只需要1个. ...

  9. swift 存储属性和计算属性 set{}和get{} didSet{}和willSet{}

    首先我们看一段代码: var A:Int = 0 var B:Int = 0 var C:Int { get { return 1 } set { print("Recived new va ...

  10. Swift 学习一函数&函数属性&懒加载

    函数 函数相当于OC中的方法 格式: func 函数名(参数列表) -> 返回值类型 {    代码块    return 返回值} func 函数名(参数列表){  // 返回值为Void 可 ...

随机推荐

  1. OpenCvSharp的安装和使用

    OpencvSharp是opencv的C#版本,使用习惯了opencv的人学起OpenCvSharp会很容易上手,看了网上很多的安装方式,最后我感觉还是自己去下载安装包的方式最简单,通过Nuget的方 ...

  2. Go语言核心36讲40

    我相信,经过上一次的学习,你已经对strings.Builder和strings.Reader这两个类型足够熟悉了. 我上次还建议你去自行查阅strings代码包中的其他程序实体.如果你认真去看了,那 ...

  3. mysql 多个结构不同表查询 返回相同字段名

    ( select ID,数据库原字段名1 AS 统一字段名1,数据库原字段名2 AS 统一字段名2 from 第一个表名 WHERE 1) UNION(联合表查询)( select ID,数据库原字段 ...

  4. 【深入浅出 Yarn 架构与实现】4-1 ResourceManager 功能概述

    前面几篇文章对 Yarn 基本架构.程序基础库.应用设计方法等进行了介绍.之后几篇将开始对 Yarn 核心组件进行剖析. ResourceManager(RM)是 Yarn 的核心管理服务,负责集群管 ...

  5. Karmada跨集群优雅故障迁移特性解析

    摘要:在 Karmada 最新版本 v1.3中,跨集群故障迁移特性支持优雅故障迁移,确保迁移过程足够平滑. 本文分享自华为云社区<Karmada跨集群优雅故障迁移特性解析>,作者:Karm ...

  6. 关于解决windows安装gcc g++环境 mingw失败

    前言 这几天学习c++,为了详细了解编译过程我没有安装vs全家桶,当然使用命令行是最好的方法. 但是为了解决这个网络问题折腾了我很久,经过我研究发现,其实就是到固定网站下载几个压缩格式的文件,然后解压 ...

  7. 实践案例:平安健康的 Dubbo3 迁移历程总结

    本篇是 Apache Dubbo 的实践案例.感兴趣的朋友可以访问官网了解更多详情,或搜索关注官方微信公众号 Apache Dubbo 跟进最新动态. 1 背景 我们公司从15年开始就使⽤dubbo作 ...

  8. 腾讯云数据库SaaS致力于构建数据库分布式云,为更多更广的用户提供服务

    大数据时代,数据库 SaaS 是企业实现降本增效和业务创新的重要抓手.在腾讯全球数字生态大会数据库 SaaS 专场上,腾讯云发布了多项数据库 SaaS 产品能力升级,并重点分享了其在上云.日常运维.数 ...

  9. 网络I/O模型 解读

    网络.内核 网卡能「接收所有在网络上传输的信号」,但正常情况下只接受发送到该电脑的帧和广播帧,将其余的帧丢弃. 所以网络 I/O 其实是网络与服务端(电脑内存)之间的输入与输出 内核 查看内核版本 : ...

  10. Django基础笔记5(Session)

    Session cookie:保存在客户端浏览器上的键值对 session:保存在服务器端的数据       保持会话 def index(req): v = req.session.get('use ...