vue3中watch的用法及讲解

简介: 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` 函数有所帮助!


相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
2月前
|
JavaScript 前端开发 安全
Vue 3
Vue 3以组合式API、Proxy响应式系统和全面TypeScript支持,重构前端开发范式。性能优化与生态协同并进,兼顾易用性与工程化,引领Web开发迈向高效、可维护的新纪元。(238字)
565 139
|
2月前
|
缓存 JavaScript 算法
Vue 3性能优化
Vue 3 通过 Proxy 和编译优化提升性能,但仍需遵循最佳实践。合理使用 v-if、key、computed,避免深度监听,利用懒加载与虚拟列表,结合打包优化,方可充分发挥其性能优势。(239字)
265 1
|
3月前
|
开发工具 iOS开发 MacOS
基于Vite7.1+Vue3+Pinia3+ArcoDesign网页版webos后台模板
最新版研发vite7+vue3.5+pinia3+arco-design仿macos/windows风格网页版OS系统Vite-Vue3-WebOS。
428 11
|
2月前
|
JavaScript 安全
vue3使用ts传参教程
Vue 3结合TypeScript实现组件传参,提升类型安全与开发效率。涵盖Props、Emits、v-model双向绑定及useAttrs透传属性,建议明确声明类型,保障代码质量。
296 0
|
4月前
|
缓存 前端开发 大数据
虚拟列表在Vue3中的具体应用场景有哪些?
虚拟列表在 Vue3 中通过仅渲染可视区域内容,显著提升大数据列表性能,适用于 ERP 表格、聊天界面、社交媒体、阅读器、日历及树形结构等场景,结合 `vue-virtual-scroller` 等工具可实现高效滚动与交互体验。
479 1
|
3月前
|
JavaScript
Vue中如何实现兄弟组件之间的通信
在Vue中,兄弟组件可通过父组件中转、事件总线、Vuex/Pinia或provide/inject实现通信。小型项目推荐父组件中转或事件总线,大型项目建议使用Pinia等状态管理工具,确保数据流清晰可控,避免内存泄漏。
339 2
|
2月前
|
缓存 JavaScript
vue中的keep-alive问题(2)
vue中的keep-alive问题(2)
318 137
|
6月前
|
人工智能 JavaScript 算法
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
823 0
|
6月前
|
JavaScript UED
用组件懒加载优化Vue应用性能
用组件懒加载优化Vue应用性能
|
7月前
|
JavaScript 数据可视化 前端开发
基于 Vue 与 D3 的可拖拽拓扑图技术方案及应用案例解析
本文介绍了基于Vue和D3实现可拖拽拓扑图的技术方案与应用实例。通过Vue构建用户界面和交互逻辑,结合D3强大的数据可视化能力,实现了力导向布局、节点拖拽、交互事件等功能。文章详细讲解了数据模型设计、拖拽功能实现、组件封装及高级扩展(如节点类型定制、连接样式优化等),并提供了性能优化方案以应对大数据量场景。最终,展示了基础网络拓扑、实时更新拓扑等应用实例,为开发者提供了一套完整的实现思路和实践经验。
918 77

热门文章

最新文章