07_侦听器

侦听器

侦听器

定义:

当被侦听的属性发生变化时,自动调用回调函数

示例:

<body>
  <div id="app">
    <h1>{{ info }}</h1>
    <h1>你的年龄为:{{ age }}</h1>
    <input type="text" placeholder="输入你的年龄" v-model="age" />
  </div>
  <script>
    const vm = new Vue({
      el: '#app',
      data() {
        return {
          age: 40,
          name: 'byoy',
        };
      },
      computed: {
        info() {
          return 'hello world!';
        },
      },
      watch: {
        age: {
          // 初始化时就调用handler函数一次
          immediate: true,
          // 当data中的age发生改变时调用handler函数
          handler(newValue, oldValue) {
            console.log(`新值:${newValue} - 旧值:${oldValue}`);
          },
        },
        info: {
          immediate: true,
          handler() {
            console.log('info被侦听了');
          },
        },
      },
    });

    // 侦听器的另外一种写法
    vm.$watch('byboy', {
      immediate: true,
      handler() {
        console.log('name被侦听了');
      },
    });
  </script>
</body>

深度侦听

watch默认不侦听对象内部的数据,配置deep属性能侦听对象内部值的改变

<body>
  <div id="app">
    <h1>ID:{{ student.id }}</h1>
    <h1>name:{{ student.name }}</h1>
    <h1>age:{{ student.age }}</h1>

    <button @click="student.age++">chagne age</button>
  </div>
  <script>
    const vm = new Vue({
      el: '#app',
      data() {
        return {
          student: {
            id: 1,
            name: 'byboy',
            age: 20,
          },
        };
      },
      watch: {
        student: {
          // 配置deep属性
          deep: true,
          handler(newValue, oldValue) {
            console.log(newValue.age, oldValue.age);
          },
        },
      },
    });
  </script>
</body>

侦听器简写

当你不需要初始化时调用watch和深度侦听的时候可以使用简写

<body>
  <div id="app">
    <h1>{{ age }}</h1>
    <button @click="age++">change age</button>
    <h1>{{ year }}</h1>
    <button @click="year++">change year</button>
  </div>
  <script>
    const vm = new Vue({
      el: '#app',
      data() {
        return {
          age: 20,
          year: 2023,
        };
      },
      watch: {
        // 直接写成一个函数
        age: function (newValue, oldValue) {
          console.log(newValue, oldValue);
        },
      },
    });

    // 侦听器的另外一种写法
    vm.$watch('year', function (newValue, oldValue) {
      console.log(newValue, oldValue);
    });
  </script>
</body>

computed和watch之间的区别:

  1. computed能完成的功能,watch都可以完成。

  2. watch能完成的功能,computed不一定能完成,例如:watch可以进行异步操作

小提示:

被vue管理的函数一般写成普通函数,this指向vm或组件实例对象

不被vue管理的函数一般写成箭头函数(定时器的回调函数、ajax的回调函数),this指向vm或组件实例对象

阅读剩余
THE END