Vue2/Vue3分别如何使用Watch

在 Vue 2 和 Vue 3 中,watch 用于监听数据的变化并执行相应的逻辑。虽然两者的核心功能相同,但在语法和使用方式上有一些区别。以下是 Vue 2 和 Vue 3 中使用 watch 的详细说明:

Vue 2 中的 watch

在 Vue 2 中,watch 是通过选项式 API 实现的,通常在组件的 watch 选项中定义。

【基本用法】

export default {
  data() {
    return {
      message: 'Hello Vue 2',
      count: 0,
    };
  },
  watch: {
    // 监听 message 的变化
    message(newVal, oldVal) {
      console.log('message changed:', newVal, oldVal);
    },
    // 监听 count 的变化
    count(newVal, oldVal) {
      console.log('count changed:', newVal, oldVal);
    },
  },
};

【监听对象属性】
如果需要监听对象的某个属性,可以使用字符串形式的键名:

export default {
  data() {
    return {
      user: {
        name: 'Alice',
        age: 25,
      },
    };
  },
  watch: {
    'user.name'(newVal, oldVal) {
      console.log('user.name changed:', newVal, oldVal);
    },
  },
};

【深度监听】
如果需要监听对象或数组内部的变化,可以设置 deep: true:

export default {
  data() {
    return {
      user: {
        name: 'Alice',
        age: 25,
      },
    };
  },
  watch: {
    user: {
      handler(newVal, oldVal) {
        console.log('user changed:', newVal, oldVal);
      },
      deep: true, // 深度监听
    },
  },
};

【立即执行】
如果需要监听器在创建时立即执行一次,可以设置 immediate: true:

export default {
  data() {
    return {
      message: 'Hello Vue 2',
    };
  },
  watch: {
    message: {
      handler(newVal, oldVal) {
        console.log('message changed:', newVal, oldVal);
      },
      immediate: true, // 立即执行
    },
  },
};

Vue3中的watch

在 Vue 3 中,watch 是通过 Composition API 实现的,使用 watch 函数来定义监听器。
【基本用法】

import { ref, watch } from 'vue';

export default {
  setup() {
    const message = ref('Hello Vue 3');
    const count = ref(0);

    // 监听 message 的变化
    watch(message, (newVal, oldVal) => {
      console.log('message changed:', newVal, oldVal);
    });

    // 监听 count 的变化
    watch(count, (newVal, oldVal) => {
      console.log('count changed:', newVal, oldVal);
    });

    return {
      message,
      count,
    };
  },
};

【监听多个数据】

import { ref, watch } from 'vue';

export default {
  setup() {
    const firstName = ref('Alice');
    const lastName = ref('Smith');

    // 监听 firstName 和 lastName 的变化
    watch([firstName, lastName], ([newFirstName, newLastName], [oldFirstName, oldLastName]) => {
      console.log('firstName or lastName changed:', newFirstName, newLastName);
    });

    return {
      firstName,
      lastName,
    };
  },
};

【监听对象属性】

import { ref, watch } from 'vue';

export default {
  setup() {
    const user = ref({
      name: 'Alice',
      age: 25,
    });

    // 监听 user.name 的变化
    watch(
      () => user.value.name,
      (newVal, oldVal) => {
        console.log('user.name changed:', newVal, oldVal);
      }
    );

    return {
      user,
    };
  },
};

【深度监听】
在 Vue 3 中,默认情况下 watch 是浅层的。如果需要深度监听,可以设置 { deep: true }:

import { ref, watch } from 'vue';

export default {
  setup() {
    const user = ref({
      name: 'Alice',
      age: 25,
    });

    // 深度监听 user 对象
    watch(
      user,
      (newVal, oldVal) => {
        console.log('user changed:', newVal, oldVal);
      },
      { deep: true }
    );

    return {
      user,
    };
  },
};

【立即执行】
如果需要监听器在创建时立即执行一次,可以设置 { immediate: true }:

import { ref, watch } from 'vue';

export default {
  setup() {
    const message = ref('Hello Vue 3');

    // 立即执行监听器
    watch(
      message,
      (newVal, oldVal) => {
        console.log('message changed:', newVal, oldVal);
      },
      { immediate: true }
    );

    return {
      message,
    };
  },
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

*neverGiveUp*

你的鼓励是我最大的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值