美文网首页
侦听器watch

侦听器watch

作者: 未路过 | 来源:发表于2022-10-19 22:33 被阅读0次

1.开发中我们在data返回的对象中定义了数据,这个数据通过插值语法等方式绑定到template中;
2.当数据变化时,template会自动进行更新来显示最新的数据;
3.但是在某些情况下,我们希望在代码逻辑中监听某个数据的变化,比如某个数据变化的时候,我们要执行一些别的东西,不旦旦是更新template中绑定的东西。这个时候就需要用侦听器watch来完成了;
computed:当依赖的数据发生改变的时候,就会重新计算,更新反应到页面上面。没有动作。
watch:当我们相对某个属性进行监听,某个属性发生改变的时候,不想单单的让他更新熏染到template的mastach语法里面,比如我们想数据发生变化,我们需要发送网络请求,axios.get("...)的时候,我们就需要使用watch。

watch可以是一个函数,也可以是一个对象,对象的化,第一个是函数,第二个是deep:是不是深度监听。
第三个是immediate,一般默认的是false,如果这样的化,第一次是不会执行这个监听函数的,第一次的oldvalue是undifend,就是页面渲染出来,数据的默认值挂载到页面这一次是不会执行的。第二个数据改变才会执行。
设置为true的化,就是第一次也会执行这个函数。并且newvalue是默认值,oldvalue是undifined。

image.png image.png image.png
  1. 侦听器的基本使用
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  
  <div id="app"></div>

  <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的变化时, 去进行一些逻辑的处理(JavaScript, 网络请求)
          question: "Hello World",
          anwser: ""
        }
      },
      watch: {
        // question侦听的data中的属性的名称
        // newValue变化后的新值
        // oldValue变化前的旧值
        question: function(newValue, oldValue) {
          console.log("新值: ", newValue, "旧值", oldValue);
          this.queryAnswer();
        }
      },
      methods: {
        queryAnswer() {
          console.log(`你的问题${this.question}的答案是哈哈哈哈哈`);
          this.anwser = "";
        }
      }
    }

    Vue.createApp(App).mount('#app');
  </script>
</body>
</html>
  1. 侦听器的配置选项
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  
  <div id="app"></div>

  <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>
</body>
</html>

3.侦听器的其他配置方式


image.png
image.png
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  
  <div id="app"></div>

  <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>
    <button @click="changeFriendName">改变friends[0].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'} },
          friends: [
            {name: "why"}, 
            {name: "kobe"}
          ]
        }
      },
      watch: {
        info(newValue, oldValue) {
          console.log(newValue, oldValue);
        },
        "info.name": function(newName, oldName) {
          console.log(newName, oldName);
        },
        "friends[0].name": function(newName, oldName) {
          console.log(newName, oldName);
        },
        // friends: {
        //   handler(newFriends, oldFriend) {
        //   },
        //   deep: true
        // }
      },
      methods: {
        changeInfo() {
          this.info = {name: "kobe"};
        },
        changeInfoName() {
          this.info.name = "kobe";
        },
        changeInfoNbaName() {
          this.info.nba.name = "james";
        },
        changeFriendName() {
          this.friends[0].name = "curry";
        }
      },
      created() {
        const unwatch = this.$watch("info", function(newInfo, oldInfo) {
          console.log(newInfo, oldInfo);
        }, {
          deep: true,
          immediate: true
        })
        // unwatch()
      }
    }

    Vue.createApp(App).mount('#app');
  </script>
</body>
</html>

相关文章

  • 计算属性,方法,侦听器

    computed 计算属性methods 方法watch 侦听器

  • Vue3:Watch 监听器

    1、什么是 watch 侦听器 watch 侦听器允许开发者监视数据的变化,从而针对数据的变化做特定的操作。例如,...

  • vue2 vue3 侦听器watch

    1.什么是watch的侦听器 watch侦听器允许开发者监视数据的变化,从而针对数据的变化做特定的操作。例如:监视...

  • Vue中的侦听器和深度监听

    1.基本使用: 2.watch方法格式侦听器的业务使用场景 3.watch对象格式侦听器的业务使用场景 4.wat...

  • 手写Vue2核心(六):侦听器watch与计算属性实现

    侦听器watch的实现原理 官方watch使用方式文档[https://cn.vuejs.org/v2/api/#...

  • 侦听器watch

    虽然计算属性在大多数情况下更合适,但有时也需要一个自定义的侦听器。这就是为什么 Vue 通过 watch 选项提供...

  • 侦听器watch

    1.开发中我们在data返回的对象中定义了数据,这个数据通过插值语法等方式绑定到template中;2.当数据变化...

  • Vue的watch API

    watch API 完全等同于组件侦听器 property watch 需要侦听特定的数据源,并在回调函数中执行副...

  • Vue中的侦听器(watch)和计算属性(computed)

    watch 侦听器 1.方法格式的侦听器 缺点1:无法在刚进入页面的时候,自动触发!!! 缺点2:如果侦听的是一个...

  • Watch监听

    侦听器,监听数据的变化,基础用法在vue中,使用watch来响应数据的变化。watch的用法大致有三种。 1、下面...

网友评论

      本文标题:侦听器watch

      本文链接:https://www.haomeiwen.com/subject/tehpzrtx.html