vue3中watch的用法及讲解

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: vue3中watch的用法及讲解

当我们在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 类型的变量 firstName 和 lastName,并使用 watch 函数来监听它们的变化。当其中任何一个变量发生变化时,输出日志信息。

需要注意的是,在回调函数中,newValues 和 oldValues 分别表示新的和旧的值数组,这些值是按照 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` 函数有所帮助!


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
24天前
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
126 64
|
24天前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
29 8
|
23天前
|
存储 JavaScript 数据管理
除了provide/inject,Vue3中还有哪些方式可以避免v-model的循环引用?
需要注意的是,在实际开发中,应根据具体的项目需求和组件结构来选择合适的方式来避免`v-model`的循环引用。同时,要综合考虑代码的可读性、可维护性和性能等因素,以确保系统的稳定和高效运行。
25 1
|
23天前
|
JavaScript
Vue3中使用provide/inject来避免v-model的循环引用
`provide`和`inject`是 Vue 3 中非常有用的特性,在处理一些复杂的组件间通信问题时,可以提供一种灵活的解决方案。通过合理使用它们,可以帮助我们更好地避免`v-model`的循环引用问题,提高代码的质量和可维护性。
33 1
|
24天前
|
JavaScript
在 Vue 3 中,如何使用 v-model 来处理自定义组件的双向数据绑定?
需要注意的是,在实际开发中,根据具体的业务需求和组件设计,可能需要对上述步骤进行适当的调整和优化,以确保双向数据绑定的正确性和稳定性。同时,深入理解 Vue 3 的响应式机制和组件通信原理,将有助于更好地运用 `v-model` 实现自定义组件的双向数据绑定。
|
7月前
|
JavaScript API
【vue实战项目】通用管理系统:api封装、404页
【vue实战项目】通用管理系统:api封装、404页
78 3
|
7月前
|
人工智能 JavaScript 前端开发
毕设项目-基于Springboot和Vue实现蛋糕商城系统(三)
毕设项目-基于Springboot和Vue实现蛋糕商城系统
|
7月前
|
JavaScript Java 关系型数据库
毕设项目-基于Springboot和Vue实现蛋糕商城系统(一)
毕设项目-基于Springboot和Vue实现蛋糕商城系统
194 0
|
7月前
|
JavaScript 前端开发 API
Vue3+Vite+TypeScript常用项目模块详解
现在无论gitee还是github,越来越多的前端开源项目采用Vue3+Vite+TypeScript+Pinia+Elementplus+axios+Sass(css预编译语言等),其中还有各种项目配置比如eslint 校验代码工具配置等等,而我们想要进行前端项目的二次开发,就必须了解会使用这些东西,所以作者写了这篇文章进行简单的介绍。
153 0
Vue3+Vite+TypeScript常用项目模块详解
|
7月前
|
设计模式 JavaScript
探索 Vue Mixin 的世界:如何轻松复用代码并提高项目性能(上)
探索 Vue Mixin 的世界:如何轻松复用代码并提高项目性能(上)
探索 Vue Mixin 的世界:如何轻松复用代码并提高项目性能(上)