vue3中watch的用法及讲解

news/2025/2/21 4:36:11/

当我们在Vue 3应用程序中想要监听数据的变化时,可以使用 watch 函数。watch 函数支持多种用法,包括监听响应式对象、计算属性、ref 对象等等。

下面我们就来详细讲解一下 watch 函数的用法。

监听响应式对象

watch 函数可以通过监听一个响应式对象来实现数据的实时更新。例如:

import { reactive, watch } from 'vue'const state = reactive({count: 0,
})watch(() => state.count,(newCount, oldCount) => {console.log(`count发生了变化:${oldCount} -> ${newCount}`)}
)state.count++ // 输出 "count发生了变化:0 -> 1"

在上面的代码中,我们首先通过 reactive 函数创建了一个响应式对象 state,并定义了一个属性 count。接着,使用 watch 函数来监听 state.count 的变化,当 count 值发生变化时,输出日志信息。

在每次修改 count 值时,会触发 watch 里的回调函数,并输出相应的日志信息。

需要注意的是,当监听的值是一个对象或数组时,只能监听到对象或数组引用的变化,而不能监听到对象或数组内部某个具体属性的变化(这种情况可以使用深度监听)。

监听计算属性

除了监听响应式对象,我们还可以使用 watch 函数来监听计算属性的变化。例如:

import { ref, computed, watch } from 'vue'const count = ref(0)
const doubleCount = computed(() => count.value * 2)watch(() => doubleCount.value,(newDoubleCount, oldDoubleCount) => {console.log(`doubleCount发生了变化:${oldDoubleCount} -> ${newDoubleCount}`)}
)count.value++ // 输出 "doubleCount发生了变化:0 -> 2"

在上面的代码中,我们首先创建了一个 ref 类型的变量 count,以及一个计算属性 doubleCount,它是 count 值的两倍。

接着,使用 watch 函数来监听 doubleCount 的变化,并输出日志信息。

count 值发生变化时,会触发计算属性 doubleCount 的重新计算,然后再触发 watch 回调函数。

监听多个值

除了监听单个值,我们也可以使用 watch 函数来监听多个数据的变化。例如:

 
import { ref, watch } from 'vue'const firstName = ref('John')
const lastName = ref('Doe')watch([firstName, lastName], ([newFirstName, newLastName], [oldFirstName, oldLastName]) => {console.log(`姓名发生了变化:${oldFirstName} ${oldLastName} -> ${newFirstName} ${newLastName}`)
})firstName.value = 'Jane' // 输出 "姓名发生了变化:John Doe -> Jane Doe"
lastName.value = 'Smith' // 输出 "姓名发生了变化:Jane Doe -> Jane Smith"

在上面的代码中,我们创建了两个 ref 类型的变量 firstNamelastName,并使用 watch 函数来监听它们的变化。当其中任何一个变量发生变化时,输出日志信息。

需要注意的是,在回调函数中,newValuesoldValues 分别表示新的和旧的值数组,这些值是按照 watch 函数第一个参数数组的顺序排列的。

监听深度对象

当我们需要监听一个嵌套较深的响应式对象的变化时,可以使用 watch 函数的 deep 选项来实现。例如:

 
import { reactive, watch } from 'vue'const state = reactive({user: {name: 'John',age: 30,address: {city: 'Los Angeles',street: '123 Main St',zip: '90001'}}
})watch(() => state,(newState, oldState) => {console.log(`state对象发生了变化`)},{ deep: true }
)state.user.address.city = 'New York' // 输出 "state对象发生了变化"

在上面的代码中,我们创建了一个较为复杂的嵌套响应式对象 `state`,其中包含一个 `user` 对象和一个 `address` 对象。接着,使用 `watch` 函数来监听整个 `state` 对象的变化,并输出日志信息。 需要注意的是,在 `watch` 函数中,如果我们想要监听嵌套对象的变化,则需要设置选项 `{ deep: true }`。这样在每次嵌套对象内部值发生变化时,都会触发回调函数。

小结

在Vue 3中, `watch` 函数提供了丰富的用法,可以用于监听各种类型的数据变化。通过 `watch` 函数,我们可以在数据发生变化时执行一些自定义的操作,从而实现更加灵活的业务逻辑。 需要注意的是,在使用 `watch` 函数时,我们要合理选择监听的目标以及回调函数的执行时机,避免出现性能问题。

希望本篇文章能够对你了解Vue 3中 `watch` 函数有所帮助!


http://www.ppmy.cn/news/61988.html

相关文章

CC、Subtile、图文

CC简介 CC(Closed Captioning)是一种为电视节目提供文本字幕的技术,通常是用来让听障人士和非母语人士更好地理解电视节目中的对话和内容。 CC技术在全球范围内得到了广泛的应用,不仅在欧洲和南美,还在北美、亚洲以及…

K8S相关核心概念

个人笔记: 要弄明白k8s的细节,需要知道k8s是个什么东西。它的主要功能,就是容器的调度--也就是把部署实例,根据整体资源的使用状况,部署到任何地方 注意任何这两个字,预示着你并不能够通过常规的IP、端口…

P1058 [NOIP2008 普及组] 立体图

题目描述 小渊是个聪明的孩子,他经常会给周围的小朋友们讲些自己认为有趣的内容。最近,他准备给小朋友们讲解立体图,请你帮他画出立体图。 小渊有一块面积为 ��mn 的矩形区域,上面有 �&#x…

Blender渲染动画太慢怎么办?用云渲染啊!

1995 年,荷兰开发者 Ton Roosendaal 开发了三维制作软件 Blender ,这是一款功能强大的 3D 创建工具,用于创建 3D 图形、交互式 3D 应用程序、视频游戏、虚拟现实视频和动画。它自 2002 年以来一直作为开源软件提供,可在 macOS、Li…

开源音频处理库AudioLDM

环境 windows 10 64bitAudioLDM 0.1.1anaconda with python 3.8nvidia gtx 1070Ti 简介 AudioLDM 是一个开源的音频处理库,它可以用于实现语音识别、语音合成、语音转换等应用,很多 AIGC 大模型都在用它。该库提供了一组音频信号处理算法,包括…

什么叫用空间换时间,用时间换空间

什么叫做用空间换时间 用空间换时间是指为了提高程序或算法的效率,将计算机程序中的时间复杂度转化为空间复杂度,即通过使用更多的空间来减少程序运行所需的时间。这种技术在某些情况下可以大幅缩短程序的执行时间,但也会导致程序需要更大的…

为何ChatGPT一出现让巨头们都坐不住?

近几个月来,ChatGPT都是当仁不让的舆论话题。 上一次AI在全球范围内引起轰动,还是谷歌的AI机器人AlphaGO下棋战胜围棋世界冠军的时候。 ChatGPT的出现,让国内外几乎所有的科技巨头都坐立不安。 2月1日,谷歌母公司Alphabet首席执…

Loadrunner性能测试(一)

备注:电脑最好安装有IE浏览器 一、下载安装包 链接:https://pan.baidu.com/s/1f5Sw0QK5zrLCU1EbN01evg?pwdbite 提取码:bite 包含的文件有: 二、安装loadrunner 注意,以下教程仅展示需要特别注意的步骤&#x…