Vue2 和 Vue3 中的 watch 用法

本文详细介绍了Vue2和Vue3中watch的使用,包括单个ref、多个ref、reactive对象的监听,以及watchEffect如何自动追踪依赖。通过实例展示了不同情况下的监听效果,强调了watchEffect关注过程的特点,对比了它与computed的差异。
摘要由CSDN通过智能技术生成

数据

    let num = ref(0);
    let msg = ref('你好');
    let person = reactive({
      name: 'zs',
      age: 13,
      job: {
        j1: {
          salary: 20,
        },
      },
    });

vue2中的写法

watch: {
    //简写
    // num(newVal, oldVal) {
    //   console.log('num值变化了', newVal, oldVal);
    // },

    //完整写法,可以配置参数
    num: {
      immediate: true, //刷新页面立即触发
      deep: true, //深度监听
      handler(newVal, oldVal) {
        console.log('num值变化了', newVal, oldVal);
      },
    },
 },

vue3中的写法

情况一,监视 ref 所定义的一个响应式数据

watch(num, function (newVal, oldVal) {
      console.log('num值变化了', newVal, oldVal);
},{immediate:true,deep:true});
//num值变化了 4 3

情况二,监视 ref 所定义的多个响应式数据

watch([num, msg], function (newVal, oldVal) {
        console.log('num或msg值变化了', newVal, oldVal);
},{ immediate: true });
//num或msg值变化了 (2) [1, '你好'] (2) [0, '你好']

情况三,监视 reactive 所定义的一个响应式数据

1.注意:此处无法正确获取oldVal
2.注意:强制开启了深度监视,(deep配置无效)

watch(person, (newVal, oldVal) => {
      console.log('person值变化了', newVal, oldVal);
},{deep:true});//此处的deep配置无效

输出结果:
情况三输出结果

情况四,监视 reactive 所定义的一个响应式数据中的某个属性,(需要写到函数里面)

watch(()=>person.age, (newVal, oldVal) => {
      console.log('person.age值变化了', newVal, oldVal);
});
//person.age值变化了 14 13

情况五,监视 reactive 所定义的一个响应式数据中的某些属性,(需要用数组包裹,在写到函数里面)

watch([()=>person.age,()=>person.name], (newVal, oldVal) => {
      console.log('person.age或.name值变化了', newVal, oldVal);
});

输出结果:
情况五输出结果
特殊情况

watch(()=>person.job, (newVal, oldVal) => {
      console.log('person.job值变化了', newVal, oldVal);
},{deep:true});//此处由于监视的是reactive所定义的对象中的某个属性,所以deep配置有效

输出结果:
输出结果

watchEffect
watch 的套路是:既要指明监视的属性,也要指明监视的回调
watchEffect 的套路是:不用指明监视哪个属性,监视的回掉中用到那个属性,那就监视哪个属性
watchEffect 有点像computed:

  • 但computed注重的计算出来的值(回调函数的返回值),所以必须要写返回值
  • 而watchEffect更注重的是过程(回调函数的函数体),所以不用写返回值
watchEffect(() => {
      const s = msg.value;
      console.log('watchEffect执行了当前信息', s);
});
//每次修改msg都会执行

总结:

1.监视 ref 所定义的一个响应式数据(可以正常拿到 newVal oldVal)
2.监视 ref 所定义的多个响应式数据(可以正常拿到 newVal oldVal, 吧监视的属性放到数组里面)
3.监视 reactive 所定义的一个响应式数据(监视对象)(无法正确获取 oldVal,强制开启了深度监视,deep配置无效)
4.监视 reactive 所定义的一个响应式数据中的某个属性(监视对象中的某个属性,如果监视的属性是个对象,需要开启深度监视 deep),(可以正常拿到 newVal oldVal,监视的属性需要写到函数里面)
5.监视 reactive 所定义的一个响应式数据中的某些属性(监视对象中的某些属性),(可以正常拿到 newVal oldVal,需要用数组包裹,在写到函数里面)

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue.jswatch是一个用于监视数据变的选项。它允许你在数据发生变化时执行相应的操作。在Vue 2和Vue 3watch的使用方式有一些区别。 在Vue 2,你可以通过在组件的选项添加watch属性来定义一个或多个观察者。每个观察者都是一个键值对,键表示要观察的数据属性,值是一个回调函数,用于处理数据变化时的操作。这个回调函数接收新值和旧值作为参数。 在Vue 3watch的使用方式有所改变。你可以使用新的watchEffect函数或watch函数来实现观察数据的变化。 - watchEffect函数是一个立即执行的观察者,它会追踪其使用的响应式数据,并在数据发生变化时重新运行。它不需要指定要观察的属性,只需要在函数内部使用响应式数据即可。 - watch函数与Vue 2用法类似,但有一些语法上的改动。它接收两个参数:要观察的数据属性和回调函数。回调函数接收一个包含新值和旧值的对象作为参数。 此外,Vue 3还引入了一个新的选项叫做watchEffect,它可以用来替代Vue 2的immediate选项。watchEffect会在组件初始化时立即执行一次,并追踪其使用的响应式数据。这使得监听数据变化的代码更加简洁。 总结一下,Vue 2watch使用watch属性定义观察者,而Vue 3可以使用watchEffectwatch函数来实现。这些变化使得Vue 3watch更加灵活和易用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值