当前位置: 首页 > article >正文

Vue 3 中的 watch:监视数据的变化

在 Vue 3 中,watch 是一个强大的工具,用于监视响应式数据的变化并执行相应的操作。与 Vue 2 中的 watch 类似,Vue 3 的 watch 功能更加灵活和强大。本文将详细介绍 Vue 3 中 watch 的使用方法,并通过代码示例演示如何监视不同类型的数据。


1. watch 的基本概念

watch 用于监视响应式数据的变化,并在数据变化时执行回调函数。Vue 3 中的 watch 可以监视以下四种数据:

  1. ref 定义的数据
  2. reactive 定义的数据
  3. 函数返回一个值(getter 函数)
  4. 一个包含上述内容的数组

2. watch 的使用方法

2.1 监视 ref 定义的数据

ref 是 Vue 3 中用于定义基本类型数据的响应式 API。我们可以使用 watch 来监视 ref 定义的数据。

import { ref, watch } from 'vue';

const count = ref(0);

watch(count, (newValue, oldValue) => {
  console.log(`count 从 ${oldValue} 变为 ${newValue}`);
});

count.value = 5; // 输出:count 从 0 变为 5

2.2 监视 reactive 定义的数据

reactive 是 Vue 3 中用于定义对象类型数据的响应式 API。我们可以使用 watch 来监视 reactive 定义的对象。

import { reactive, watch } from 'vue';

const state = reactive({
  name: 'Alice',
  age: 20
});

watch(
  () => state.age,
  (newValue, oldValue) => {
    console.log(`age 从 ${oldValue} 变为 ${newValue}`);
  }
);

state.age = 21; // 输出:age 从 20 变为 21

2.3 监视 getter 函数

我们可以通过 getter 函数来监视某个特定的值,而不是整个对象。

import { reactive, watch } from 'vue';

const state = reactive({
  name: 'Alice',
  age: 20
});

watch(
  () => state.age > 18, // getter 函数
  (newValue, oldValue) => {
    console.log(`是否成年:${newValue}`);
  }
);

state.age = 17; // 输出:是否成年:false
state.age = 19; // 输出:是否成年:true

2.4 监视数组

我们可以通过数组来同时监视多个数据源。

import { ref, watch } from 'vue';

const count = ref(0);
const name = ref('Alice');

watch(
  [count, name],
  ([newCount, newName], [oldCount, oldName]) => {
    console.log(`count 从 ${oldCount} 变为 ${newCount}`);
    console.log(`name 从 ${oldName} 变为 ${newName}`);
  }
);

count.value = 5; // 输出:count 从 0 变为 5
name.value = 'Bob'; // 输出:name 从 Alice 变为 Bob

3. watch 的高级用法

3.1 深度监视

默认情况下,watch 是浅层监视的,即它只监视对象的第一层属性。如果需要监视对象的嵌套属性,可以使用 deep 选项。

import { reactive, watch } from 'vue';

const state = reactive({
  user: {
    name: 'Alice',
    age: 20
  }
});

watch(
  () => state.user,
  (newValue, oldValue) => {
    console.log('user 对象发生变化');
  },
  { deep: true } // 深度监视
);

state.user.age = 21; // 输出:user 对象发生变化

3.2 立即执行

默认情况下,watch 只有在监视的数据发生变化时才会执行回调函数。如果需要在初始化时立即执行回调函数,可以使用 immediate 选项。

import { ref, watch } from 'vue';

const count = ref(0);

watch(
  count,
  (newValue, oldValue) => {
    console.log(`count 从 ${oldValue} 变为 ${newValue}`);
  },
  { immediate: true } // 立即执行
);

// 输出:count 从 undefined 变为 0

4. 案例:监视老师信息的变化

假设我们有一个老师的信息对象,包含姓名、年龄和教授的课程。我们可以使用 watch 来监视这些信息的变化。

4.1 代码示例

<template>
  <div>
    <h2>老师信息</h2>
    <p>姓名: {{ teacher.name }}</p>
    <p>年龄: {{ teacher.age }}</p>
    <p>课程: {{ teacher.course }}</p>
    <button @click="updateTeacher">修改老师信息</button>
  </div>
</template>

<script setup lang="ts">
import { reactive, watch } from 'vue';

// 定义老师信息的响应式对象
const teacher = reactive({
  name: '张老师',
  age: 40,
  course: '数学'
});

// 监视 teacher 对象的变化
watch(
  () => teacher,
  (newValue, oldValue) => {
    console.log('老师信息发生变化', newValue);
  },
  { deep: true } // 深度监视
);

// 修改老师信息的函数
const updateTeacher = () => {
  teacher.name = '李老师';
  teacher.age = 45;
  teacher.course = '物理';
};
</script>

4.2 代码解析

  1. 响应式对象

    • 使用 reactive 创建了一个包含老师信息的响应式对象 teacher
  2. 监视对象

    • 使用 watch 监视 teacher 对象的变化,并启用 deep 选项以深度监视嵌套属性。
  3. 修改信息

    • 点击按钮后,teacher 对象的属性会被修改,触发 watch 回调函数。

5. 总结

  • watch 的作用:监视响应式数据的变化,并在数据变化时执行回调函数。
  • 监视的数据类型refreactive、getter 函数、数组。
  • 高级用法:深度监视(deep)、立即执行(immediate)。
  • 适用场景:适用于需要在数据变化时执行异步操作或复杂逻辑的场景。

通过本文的介绍和代码示例,希望你能更好地理解 Vue 3 中 watch 的使用方法,并在实际项目中灵活运用它来监视数据的变化!


http://www.kler.cn/a/524943.html

相关文章:

  • 供应链系统设计-供应链中台系统设计(十)- 清结算中心概念片篇
  • csapp2.4节——浮点数
  • 探秘 TCP TLP:从背景到实现
  • python——Django 框架
  • 软件架构的演变:从大型机和整体式应用到分布式计算
  • 【蓝桥杯嵌入式入门与进阶】2.与开发板之间破冰:初始开发板和原理图2
  • lambda 表达式:Python中的极简艺术
  • 微服务入门(go)
  • Ceph:关于Ceph 中 RADOS 块设备快照克隆管理的一些笔记整理(12)
  • 基于单片机的车载传感器数据处理系统
  • matlab提取滚动轴承故障特征
  • 2025数学建模美赛|赛题翻译|D题
  • 【每日一A】2015NOIP真题 (二分+贪心) python
  • 第24篇 基于ARM A9处理器用汇编语言实现中断<六>
  • sqlzoo答案5-SUM and COUNT
  • MATLAB中lettersPattern函数用法
  • python学opencv|读取图像(五十)使用addWeighted()函数实现图像加权叠加效果
  • 【JavaWeb06】Tomcat基础入门:架构理解与基本配置指南
  • 【Hadoop】Hadoop 概述
  • 选择的阶段性质疑
  • 冯诺依曼系统及操作系统
  • C#通过3E帧SLMP/MC协议读写三菱FX5U/Q系列PLC数据案例
  • Python面试宝典7 | 正则表达式的match()与search(),精准匹配与全局搜索
  • Spring MVC 框架:构建高效 Java Web 应用的利器
  • LeetCode:343. 整数拆分
  • MyBatis 框架:简化 Java 数据持久化的利器