vue之watch详解

什么是watch?

一个对象,键是需要观察的表达式,值是对应回调函数。值也可以是方法名,或者包含选项的对象。Vue 实例将会在实例化时调用 $watch(),遍历 watch 对象的每一个属性。

类型{ [key: string]: string | Function | Object | Array }

测试公共代码如下:

<template>
    <div>
        <input type="text" v-model="watchTextOne"/><br><br>
        <input type="text" v-model="watchTextTwo"/><br><br>
        <input type="text" v-model="watchTextThree"/><br><br>
        <input type="text" v-model="watchTextFour.name"/><br><br>
        <input type="text" v-model="watchTextFour.age"/><br><br>
        <input type="text" v-model="watchTextFour.feature"/><br><br>
        <input type="text" v-model="watchTextFour.feature[0]"/>
    </div>
</template>
<script>
    export default {
        data () {
            return {
                watchTextOne: '',
                watchTextTwo: '',
                watchTextThree: '',
                watchTextFour: {
                    name: 'fx',
                    age: 18,
                    feature: ['smart', 'great']
                }
            }
        },
    }
</script>

第一种方式: 

watch: {
    // 第一种watch监听方式
    watchTextOne (newVal, oldVal) {
        console.log('watchTextOne新值:', newVal)
        console.log('watchTextOne旧值:', oldVal)
    },
},

第二种方式:

watch: {
    // 第二种watch监听方式,写一个监听处理函数
    watchTextTwo: 'watchTextTwoFn',
}|
methods: {
    watchTextTwoFn (newVal, oldVal) {
        console.log('watchTextTwo新值:', newVal)
        console.log('watchTextTwo旧值:', oldVal)
    },
},

以上两种方式使用watch时有一个特点,就是当值第一次绑定的时候,不会执行监听函数,只有值发生改变才会执行。
如果我们需要在最初绑定值的时候也执行函数,则就需要用到immediate属性。
比如当父组件向子组件动态传值时,子组件props首次获取到父组件传来的默认值时,也需要执行函数,此时就需要将immediate设为true。 

第三种方式:

watchTextThree: {
    handler (newVal, oldVal) {
        console.log('watchTextThree新值:', newVal)
        console.log('watchTextThree旧值:', oldVal)
    },
    immediate: true // immediate表示在watch中首次绑定的时候,是否执行handler
},

 当需要监听一个对象的改变时,普通的watch方法无法监听到对象内部属性的改变,只有data中的数据才能够监听到变化,此时就需要deep属性对对象进行深度监听。

watchTextFour: {
    handler (newVal, oldVal) {
        console.log('watchTextFour新值:', newVal)
        console.log('watchTextFour旧值:', oldVal)
    },
    deep: true // 此时会给watchTextFour的所有属性都加上这个监听器,当对象属性较多时,每个属性值的变化都会执行handler。
},

如果只需要监听对象中的一个属性值,则可以做以下优化:使用字符串的形式监听对象属性: 

'watchTextFour.age': {
    handler (newVal, oldVal) {
        console.log('watchTextFour.age新值:', newVal)
        console.log('watchTextFour.age旧值:', oldVal)
    },
    deep: true
},

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Vue3中的`watch`与Vue2中的`watch`有一些重要的变化。在Vue3中,`watch`仍然允许我们监视响应式数据的变化,并对变化做出相应的操作。不过,Vue3引入了一个新的API——`watchEffect`来取代Vue2中的`watch`。 在Vue3中,`watch`可以通过以下几种方式使用: 1. **基础用法**:可以使用`watch`方法来监视一个响应式数据的变化,并在变化发生时执行回调函数。示例如下: ```javascript import { watch } from 'vue'; watch(() => { // 监视的响应式数据 return state.value; }, (newVal, oldVal) => { // 响应式数据发生变化时执行的回调函数 console.log(`new value: ${newVal}, old value: ${oldVal}`); }); ``` 2. **立即执行**:可以通过在`watch`选项中设置`immediate`为`true`,使得监听函数会在初始创建时立即执行一次。示例如下: ```javascript watch(() => { // 监视的响应式数据 return state.value; }, (newVal, oldVal) => { // 响应式数据发生变化时执行的回调函数 console.log(`new value: ${newVal}, old value: ${oldVal}`); }, { immediate: true }); ``` 3. **深度监听**:可以通过设置`deep`为`true`来进行深度监听,以便检测对象内部值的变化。示例如下: ```javascript watch(() => { // 监视的响应式数据 return state.obj; }, (newVal, oldVal) => { // 响应式数据发生变化时执行的回调函数 console.log(`new value: ${newVal}, old value: ${oldVal}`); }, { deep: true }); ``` 此外,Vue3还引入了`watchEffect`,它可以轻松地监视响应式数据的变化,并在其变化时执行回调函数。与`watch`不同的是,`watchEffect`不需要显式指定要监视的数据,它会自动追踪代码中使用的响应式数据,并在其变化时触发。示例如下: ```javascript import { watchEffect } from 'vue'; watchEffect(() => { // 使用到的响应式数据 console.log(state.value); }); ``` 需要注意的是,在Vue3中,`watch`和`watchEffect`都是基于副作用函数实现的,所以它们可以在组件渲染期间多次执行。 以上是Vue3中`watch`和`watchEffect`的详细说明,希望能对你有所帮助!如有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wflynn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值