Watch和WatchEffect的区别

本文对比了Vue3中的watch和watchEffect,介绍了它们的执行时机、数据监听、值获取以及各自的适用场景。watch是惰性执行且可指定监听数据,而watchEffect则在初始化时执行,自动追踪响应式数据,适合触发副作用。

Watch和WatchEffect的区别

watch和watchEffect在Vue 3中都是用于处理响应式数据的变动,但它们之间存在一些关键区别。
1、初始化执行
2、指定监听的数据
3、获取数据变化前后的值
4、适用场景

一、初始化执行

初始化执行时机。

watchEffect在组件初始化时会立即执行一次,用来收集依赖。

而watch则是惰性执行的,只有在被监听的数据发生变化时才会执行。

如果设置了immediate:true,则watch在页面首次加载时就会执行。

<script setup>
import {ref, watch, watchEffect} from "vue";

let firstName = ref('')
let endName = ref('')
let fullName = ref('')

watch([firstName,endName,fullName],(newName,oldName)=>{
    console.log('watch方法执行')
    // console.log(newName,oldName)
    fullName.value=firstName.value+endName.value
    console.log(newName,oldName)
})

watchEffect(()=>{
    console.log('watchEffect方法执行')
    console.log(firstName.value)
    console.log(endName.value)
    fullName.value=firstName.value+endName.value
    console.log(fullName.value)
})
</script>

<template>
  <main>
      姓:<input type="text" v-model="firstName">
      名:<input type="text" v-model="endName">
      姓名:<input type="text" v-model="fullName">
  </main>
</template>

执行结果:在这里插入图片描述

watch方法添加immediate方法后的执行结果

在这里插入图片描述
在这里插入图片描述

二、指定监听的数据

watch需要手动指定要监听的数据和回调函数;
watch(监听的属性回调函数(newVal,oldVal),{deep:true,immediate: true})

watch([firstName],(newName,oldName)=>{//方法中只指定要监听firstName属性,所以其他两个属性值监听不到
    console.log('watch方法执行')
    // console.log(newName,oldName)
    console.log(endName.value)
    console.log(newName,oldName)
},)

watchEffect则不需要显式地指定要监听的数据,它会自动追踪函数内部使用的响应式数据

watchEffect(()=>{
    console.log('watchEffect方法执行')
    console.log(firstName.value)
    console.log(endName.value)
    fullName.value=firstName.value+endName.value
    console.log(fullName.value)
})
},)

输入:
在这里插入图片描述

执行结果:
在这里插入图片描述

三、获取数据变化前后的值

watch可以同时获取更改前后的值;

watchEffect则无法获取到更改前的值,它只能获取到变化后的值。

在这里插入图片描述

四、适用场景

watch适用于需要细粒度控制响应式数据变化的场景,比如需要手动停止监听或访问数据变化前后的值

watchEffect则更适合用于自动追踪响应式数据并触发副作用的场景,如执行异步操作或更新UI。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值