侦听器watch

侦听器的基本使用

*官方文档:https://v3.cn.vuejs.org/api/instance-methods.html#watch

  • 什么是侦听器?

    • 开发中我们data返回的对象中定义了数据,这个数据通过插值语法等方式绑定到template中。
    • 当数据变化时,template会自动进行更新来显示最新的数据。
    • 但是在某些情况下,我们希望代码逻辑中监听某个数据的变化,这个时候就需要侦听器watch来完成。
  • 侦听器的用法:

    • 选项 : watch
    • 类型 :{[key:string]:string | Function | Object | Array}
  • watch的基本使用:

<template id="my-app">
    您的问题:<input type="text" v-model="question">
    <button @click="queryAnswer">查找答案</button>
  </template>

  <SCript src="../js/vue.js"></SCript>
  <SCript>
    const App = {
      template:'#my-app',
      data() {
        return {
          // 侦听question的变化,去进行一些逻辑的处理
          question: 'hello Vue3'
        }
      },
      watch: {
        // question侦听data中的属性名称
        // 第一个参数,newValue,变化后的新值
        // 第二个参数,oldValue,变化前的旧值
        question(newValue, oldValue) {
          console.log("新值:" + newValue, ",旧值:" + oldValue)
          this.queryAnswer()
        }
      },
      methods: {
        queryAnswer() {
          console.log(`你的问题${this.question}的答案是哈哈哈`);
        }
      },
    }

    Vue.createApp(App).mount('#app')
  </SCript>
  • 输入框中的内容每次变化都被侦听到去调用watch的question函数

  • 一般watch用来侦听data中的数据变化时,需要的逻辑处理(界面变化可以使用v-model)

侦听器的配置选项

<template id="my-app">
    <h2>{{info.name}}</h2>
    <button @click="changeInfo">改变info</button>
    <button @click="changeInfoName">改变info.name</button>
    <button @click="changeInfoNbaName">改变info.nba.name</button>
  </template>

  <script src="../js/vue.js"></script>
  <script>
    const App = {
      template: '#my-app',
      data() {
        return {
          info: { name: "why", age: 18, nba: {name: 'kobe'} }
        }
      },
      watch: {
        // 默认情况下我们的侦听器只会针对监听的数据本身的改变(内部发生的改变是不能侦听)
        // info(newInfo, oldInfo) {
        //   console.log("newValue:", newInfo, "oldValue:", oldInfo);
        // }

        // 深度侦听/立即执行(一定会执行一次)
        info: {
          handler: function(newInfo, oldInfo) {
            console.log("newValue:", newInfo.nba.name, "oldValue:", oldInfo.nba.name);
          },
          deep: true, // 深度侦听
          // immediate: true // 立即执行
        }
      },
      methods: {
        changeInfo() {
          this.info = {name: "kobe"};
        },
        changeInfoName() {
          this.info.name = "kobe";
        },
        changeInfoNbaName() {
          this.info.nba.name = "james";
        }
      }
    }

    Vue.createApp(App).mount('#app');
  </script>
  • 默认情况下我们的侦听器只会针对监听的数据本身的改变(内部发生的改变是不能侦听)
  • deep: 设置为true,开始深度侦听
  • 设置为深度侦听后,就可以侦听到info内部数据的变化了
  • immediate:设置为true后,被侦听的对象在渲染完后,一定会立即执行一次

侦听器的其他方式

  • "info.name"这种方式可以单独只监听的info的name属性的变化
  • 这种方式Vue3文档中没有提到,但是Vue2文档中有提到的是侦听对象的属性
  • 当侦听对象嵌套多层时:
friends: [
            {name: "why"}, 
            {name: "kobe"}
          ]
  • 如果监听对象有多层嵌套关系,可以通过v-for遍历该对象后,将每一个值通过prop传递给子组件,再进行监听
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值