欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Vue基础之侦听器详解

程序员文章站 2022-03-16 18:58:16
目录vue中什么是侦听器侦听器的用法vue侦听器-watchvue侦听器-深度侦听和立即执行总结vue中什么是侦听器 开发中我们在data返回的对象中定义了数据,这个数据可以通过插值语法等方式绑...

vue中什么是侦听器

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

官方定义:vue 通过 watch 选项提供了一个更通用的方法,来响应数据的变化。当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的。

一个对象,键是要侦听的响应式 property——包含了 data 或 computed property,而值是对应的回调函数。值也可以是方法名,或者包含额外选项的对象。组件实例将会在实例化时调用 $watch(),参阅 $watch,以了解更多关于 deep、immediate 和 flush 选项的信息

侦听器的用法

选项:watch

类型:{ [key: string]: string | function | object | array}

侦听器watch的配置选项:

默认情况下,watch只是在侦听数据的引用变化,对于数据内部属性的变化是不会做出响应的:

这个时候我们可以使用一个选项deep进行更深层的侦听;另外一个属性,是希望一开始的就会立即执行一次:这个时候我们使用immediate选项;这个时候无论后面数据是否有变化,侦听的函数都会有限执行一次;

data的内容:

data() {
    return {
        info: {
            name: 'cgj'
        }
    }
}
watch: {
    info: {
        handler(newvalue, oldvalue) {
            console.log(newvalue, oldvalue)    
        }
        deep: true,
        immediate: true,
    }
}

另外一个是vue3文档中没有提到的,但是vue2文档中有提到的是侦听对象的属性:

'info.name': function(newvalue, oldvalue) {
    console.log(newvalue, oldvalue)
}

还有另外一种方式就是使用 $watch 的api:

具体$watch可以查看官方的api查看(用的方式比较少):实例方法 | vue.js

const app = createapp({
  data() {
    return {
      a: 1,
      b: 2,
      c: {
        d: 4
      },
      e: 5,
      f: 6
    }
  },
  watch: {
    // 侦听* property
    a(val, oldval) {
      console.log(`new: ${val}, old: ${oldval}`)
    },
    // 字符串方法名
    b: 'somemethod',
    // 该回调会在任何被侦听的对象的 property 改变时被调用,不论其被嵌套多深
    c: {
      handler(val, oldval) {
        console.log('c changed')
      },
      deep: true
    },
    // 侦听单个嵌套 property
    'c.d': function (val, oldval) {
      // do something
    },
    // 该回调将会在侦听开始之后被立即调用
    e: {
      handler(val, oldval) {
        console.log('e changed')
      },
      immediate: true
    },
    // 你可以传入回调数组,它们会被逐一调用
    f: [
      'handle1',
      function handle2(val, oldval) {
        console.log('handle2 triggered')
      },
      {
        handler: function handle3(val, oldval) {
          console.log('handle3 triggered')
        }
        /* ... */
      }
    ]
  },
  methods: {
    somemethod() {
      console.log('b changed')
    },
    handle1() {
      console.log('handle 1 triggered')
    }
  }
})
const vm = app.mount('#app')
vm.a = 3 // => new: 3, old: 1

vue侦听器-watch

目标: 可以侦听data/computed属性值改变

语法:

watch: {
    "被侦听的属性名" (newval, oldval){
    }
}

例子代码:

<template>
  <div>
    <input type="text" v-model="name">
  </div>
</template>
<script>
export default {
  data(){
    return {
      name: ""
    }
  },
  // 目标: 侦听到name值的改变
  /*
  语法:
    watch: {
      变量名 (newval, oldval){
        // 变量名对应值改变这里自动触发
      }
    }
  */
  watch: {
    // newval: 当前最新值
    // oldval: 上一刻值
    name(newval, oldval){
      console.log(newval, oldval);
    }
  }
}
</script>
<style>
</style>

小结: 想要侦听一个属性变化, 可使用侦听属性watch

vue侦听器-深度侦听和立即执行

目标: 可以侦听data/computed属性值改变

语法:

watch: {
    "被侦听的属性名" (newval, oldval){
    }
}

例子代码:

<template>
  <div>
    <input type="text" v-model="user.name">
    <input type="text" v-model="user.age">
  </div>
</template>
<script>
export default {
  data(){
    return {
      user: {
        name: "",
        age: 0
      }
    }
  },
  // 目标: 侦听对象
  /*
  语法:
    watch: {
      变量名 (newval, oldval){
        // 变量名对应值改变这里自动触发
      },
      变量名: {
        handler(newval, oldval){
        },
        deep: true, // 深度侦听(对象里面层的值改变)
        immediate: true // 立即侦听(网页打开handler执行一次)
      }
    }
  */
  watch: {
    user: {
      handler(newval, oldval){
        // user里的对象
        console.log(newval, oldval);
      },
      deep: true,
      immediate: true
    }
  }
}
</script>
<style>
</style>

小结: immediate立即侦听, deep深度侦听, handler固定方法触发

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注的更多内容!

相关标签: Vue 侦听器