侦听属性 watch

简介: 侦听属性 watch

如果希望监听某个数据的变化,当数据变化后,再做出特定的操作,这个时候就需要使用侦听属性了。

侦听属性 watch 适合处理一些消耗性能的需求,比如 Ajax 请求等等。

当被监视的数据发生变化时,回调函数会自动执行,并进行相关操作。

监视的数据必须存在,才能进行监听!!

正常写法:

<div id="APP">
  <h2>今天天气很{{info}}</h2>
  <button @click="istoggle">切换天气</button>
</div>
const vm = new Vue({
  el: "#APP",
  data(){
    return {
      isHot: true
    }
  },
  methods:{
    istoggle(){
      this.isHot = !this.isHot;
    }
  },
  computed:{
    info(){
      return this.isHot ? '炎热' : '凉爽';
    }
  },
  watch:{
    // 侦听属性的名称必须和数据名称一致。
    isHot:{
      // 侦听属性中的 handler 是一个配置项,当监听的数据发生变化后就会执行。
      handler(newValue,oldValue){
        // 可以在 handler 中接收新旧数据,参数名自定义。
        console.log("isHot被修改了");
        console.log("改变后的数据",newValue);
        console.log("改变前的数据",oldValue);
      }
    },
  }
});

:当点击切换天气按钮后,监听的数据 isHot 发生了变化,就会自动执行 watch 中的 isHot 侦听属性。

深度监视:

<div id="APP">
  <h3>a的值是:{{numbers.a}}</h3>
  <button @click="adda">点击让a+1</button>
  <h3>b的值是:{{numbers.b}}</h3>
  <button @click="addb">点击让b+1</button>
  <hr/>
  <button @click="isReplace">替换numbers的引用地址</button>
</div>

原因:当我们改变 a 或者改变 b 的值时,只是改变的 numbers 对象中的内容,而 numbers 对象的引用地址未发生改变,所以不会触发 numbers 的侦听属性。

 

 

:当改变 numbers 的引用地址时,也可以触发内部值 a 和 b 的侦听属性。

深度监视:如果想改变 a 或者改变 b 的值时,让 numbers 的侦听属性也执行,就需要开启深度监视了。

在侦听属性中,配置 deep 属性为 true 就可以监测对象内部值的改变了,监测多层数据。

简写方式【常用】

当 watch 的配置项只需要用到 handler 时,就可以使用简写的方式了。也就是说简写方式不可以使用 immediate 初始化执行或者 deep 深度监视 。

<div id="APP">
  <h3>num的值是:{{num}}</h3>
  <button @click="add">点击让num+1</button>
</div>
const vm = new Vue({
  el: "#APP",
  data(){
    return {
      num: 1
    }
  },
  methods:{
    add(){
      this.num++;
    },
  },
  watch:{
    num(newValue,oldValue){
      console.log("num 被修改了");
      console.log("改变后的数据",newValue);
      console.log("改变前的数据",oldValue);
    }
  }
});

:简写时侦听属性需要写成函数,但是不能写成箭头函数!否则 this 将不再指向 Vue 实例 或 组件实例对象。

 

$watch 简写方式【了解】

<div id="APP">
  <h3>num的值是:{{num}}</h3>
  <button @click="add">点击让num+1</button>
</div>
const vm = new Vue({
  el: "#APP",
  data(){
    return {
      num: 1
    }
  },
  methods:{
    add(){
      this.num++;
    },
  }
});
vm.$watch('num',function(newValue,oldValue){
  console.log("num 被修改了");
  console.log("改变后的数据",newValue);
  console.log("改变前的数据",oldValue);
})

 

原创作者 :吴小糖

创作时间:2023.2.12

相关文章
|
供应链 物联网 区块链
未来已来:探索新兴技术在现代世界的应用与挑战
【7月更文挑战第9天】随着科技的不断进步,新兴技术如区块链、物联网(IoT)、虚拟现实(VR)等正在改变我们的生活和工作方式。本文将深入探讨这些技术的发展趋势、应用场景以及面临的挑战,旨在为读者提供一个全面的视角,以理解这些技术如何塑造我们的未来。
177 3
|
存储 算法 Java
Java程序设计实验2 | Java语言基础(二)
分别用do-while和for循环计算1+1/2!-1/3!+1/4!-1/5!…的前20项之和。
181 1
|
安全 Unix Apache
开源许可证保姆级入门手册
还在为开源许可证头秃?快收下这份保姆级入门手册~
277 0
开源许可证保姆级入门手册
|
存储 算法 Linux
Baumer工业相机堡盟工业相机如何通过BGAPISDK切换数据BPP8和BPP10和BPP12格式功能(C++)
Baumer工业相机堡盟工业相机如何通过BGAPISDK切换数据BPP8和BPP10和BPP12格式功能(C++)
276 0
解决RuntimeError: running_mean should contain 36864 elements not 4096
一般在卷积层Conv2d后添加正则化BNBatchNormal,使得数据在relu激活前不会因为数据过大而导致网络不稳定,而我在代码中BatchNorm2d的输入通道数与前一层Conv2d的输出通道数不一致,导致报这个错,两者修改一直即可(这里修改为36864即可)。
1156 0
|
Python
禁止直接分配给多对多集的正面改用emails_for_help.set()
禁止直接分配给多对多集的正面改用emails_for_help.set()
|
API
Nuxt.js打包后报错DOMException: Failed to execute appendChild on Node
Nuxt.js打包后报错DOMException: Failed to execute appendChild on Node
151 0
|
机器学习/深度学习 算法
组合数学 - 波利亚定理 --- poj : 2154 Color
Color Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7873   Accepted: 2565 Description Beads of N colors are conn...
880 0
WCF入门(三)——消息交换模式
在WCF中的消息交换模式: (一)one way 单向:使用单向操作时,只能传输一个消息。 接收方不发送答复消息,发送方也不需要获得答复消息。如果是单向,那么意味着服务处理客户请求的过程中出现的异常信息,也无法传递到客户。
807 0