vue中watch相关用法

Vue中watch用法

当需要在数据变化时执行异步或开销较大的操作时,使用侦听器 watch 的方式是最有用的

  • 监听某一数据的变化
  • 监听对象或数组的变化
  • 监听对象或数组某一属性的变化
  • 监听路由的变化

监听某一数据的变化

<template>
  <div>
    <!-- 侦听器:当需要在数据变化时执行异步或开销较大的操作时,使用侦听器 watch 方式是最有用的 -->
    <input type="text" v-model="firstName"> + 
    <input type="text" v-model="lastName"> = 
    <input type="text" v-model="fullName">
  </div>
</template>

<script>
export default {
  name: 'watch',
  data() {
    return {
      firstName: 'ff',
      lastName: 'll',
      fullName: '',
    }
  },
  watch: {
    // 1.监听某一数据的变化
    firstName(newVal, oldVal) {
      console.log('firstName:',newVal + ' ' + oldVal)
      this.fullName = newVal + ' ' + this.lastName
    },
    lastName(newVal, oldVal) {
      console.log('lastName:',newVal + ' ' + oldVal)
      this.fullName = this.firstName + ' ' + newVal
    }
  },
}
</script>

在这里插入图片描述
这种方式有一个缺点,就是当值第一次绑定的时候不会执行监听函数,只有当值改变的时候才会执行。

immediate和handler

如果我们想在第一次绑定的时候执行此监听函数,则需要设置 immediate: true

  watch: {
    firstName: {
      handler(newVal, oldVal) {
        console.log('firstName:',newVal + ' ' + oldVal)
        this.fullName = newVal + ' ' + oldVal
      },
      immediate: true
    },
    lastName: {
      handler(newVal, oldVal) {
        console.log('lastName:',newVal + ' ' + oldVal)
        this.fullName = this.firstName + ' ' + newVal
      },
      immediate: true
    }
  },

在这里插入图片描述
注意:

  • 监听的数据后面写成对象的形式,包含 handler 方法和 immediate,之前我们写的函数其实就是在使用 handler 方法。
  • immediate 表示 watch 中首次绑定的时候,是否执行 handler,值为 true,表示在 watch 中声明的时候,就立即执行 handler 方法,值为 false,则和一般使用 watch 一样,在数据发生变化的时候才执行 handler

监听对象或数组的变化

当需要监听对象或数组的变化时,需要设置 deep: true,否则监听不对对象的变化

deep
<template>
  <div>
    <input type="text" v-model="goods.price">
  </div>
</template>

<script>
export default {
  name: 'watch',
  data() {
    return {
      goods: {
        price: 15,
        width: 1,
      },
    }
  },
  watch: {
    goods: {
      handler(newVal, oldVal) {
        console.log(newVal + ' ' + oldVal)
      },
      immediate: true,
      deep: true
    },
  },
}
</script>

当需要监听一个对象的改变时,普通的 watch 方法无法监听到对象内部属性的改变,只有 data 中的数据才能够监听到变化,此时需要 deep 属性来对对象进行深度监听。
注意:
设置 deep: true 则可以监听到对象内部属性的变化,此时,会给对象内部的所有属性都加上这个监听器,当对象属性较多时,每个属性值的变化都会执行 handler,如果只需要监听对象中的一个属性值,则可以做一下优化-——使用字符串的形式监听对象属性。如下:

监听对象或数组某一属性的变化

  watch: { // 键路径必须加上引号
    'goods.price': {
      handler(newVal, oldVal) {
        console.log(newVal, oldVal)
      },
      immediate: true,
      // deep: true   不用使用 deep
    }
  },

监听路由的变化

  watch: {
    '$route.path': function(newVal, oldVal) {
      console.log(newVal, oldVal)
      if (newVal == '/slot') {
        console.log('欢迎进入 slot 页面')
      } else if (newVal == '/computed') {
        console.log('欢迎进入计算页面')
      }
    }
  },
  $route(to, from) { // to是到哪去,from 是从哪来
      console.log(to.path, from)
   }
Vue,可以使用watch来响应数据的变化。watch用法大致有三种。下面是watch的一种简单用法: ```html <input type="text" v-model="cityName"/> new Vue({ el: '#root', data: { cityName: 'shanghai' }, watch: { cityName(newName, oldName) { // ... } } }) ``` 这段代码,我们在Vue实例定义了一个data属性cityName,并使用v-model指令将其绑定到一个输入框上。然后,在Vue实例的watch选项,我们使用了一个cityName的watcher,并定义了一个handler函数来处理数据变化的逻辑。当cityName发生变化watcher会自动调用handler函数,并传入新值和旧值作为参数。 除了简单的watch用法外,还有两种特殊的用法。一种是immediate属性,它表示在watch首次绑定数据,是否立即执行handler函数。如果immediate为true,则在watch声明的候就会立即执行handler方法;如果immediate为false,则和一般使用watch一样,在数据发生变化执行handler。 另一种特殊用法是深度监听,使用deep属性来对对象进行深度监听。普通的watch方法无法监听对象内部属性的改变,只能监听到对象的引用变化或整个对象的替换。但是使用deep属性后,watch可以递归监听对象内部属性的改变。 ```html <input type="text" v-model="cityName.name"/> new Vue({ el: '#root', data: { cityName: {id: 1, name: 'shanghai'} }, watch: { cityName: { handler(newName, oldName) { // ... }, deep: true, immediate: true } } }) ``` 这段代码,我们将cityName修改为一个对象,同watch使用了一个带有深度监听和立即执行的cityName的watcher。这样,无论是cityName的引用变化还是内部属性的改变,watcher都会调用handler函数。 总结起来,Vuewatch用于监听数据的变化,并在变化执行相应的逻辑。可以使用简单的watch,也可以使用immediate和deep属性来实现更复杂的监听需求。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值