Vue3中watch如何使用

发布时间:2022-04-28 16:36:54 作者:iii
来源:亿速云 阅读:665
# Vue3中watch如何使用

## 前言

在Vue3的响应式系统中,`watch` API是监控数据变化的核心工具之一。相比Vue2,Vue3的`watch`在Composition API中有了更灵活的使用方式。本文将全面剖析Vue3中`watch`的使用方法,涵盖基础用法、高级技巧以及性能优化建议。

---

## 一、watch基础概念

### 1.1 什么是watch
`watch`是Vue提供的响应式API,用于观察特定数据源的变化并在回调函数中执行副作用操作。

```javascript
import { watch } from 'vue'

watch(source, callback, options)

1.2 watch与watchEffect的区别

特性 watch watchEffect
依赖收集 显式声明 自动收集
立即执行 需配置immediate 默认立即执行
旧值获取 可获取 不可获取

二、基本使用方式

2.1 监听单个ref

const count = ref(0)
watch(count, (newVal, oldVal) => {
  console.log(`count变化: ${oldVal} -> ${newVal}`)
})

2.2 监听reactive对象

const state = reactive({ 
  user: { name: 'Alice' },
  score: 100
})

// 监听整个对象
watch(() => state, (newVal) => {
  console.log('state变化:', newVal)
}, { deep: true })

// 监听特定属性
watch(() => state.user.name, (name) => {
  console.log('用户名变更:', name)
})

2.3 监听多个数据源

const x = ref(0)
const y = ref(0)

watch([x, y], ([newX, newY], [oldX, oldY]) => {
  console.log(`坐标变化: (${oldX},${oldY}) -> (${newX},${newY})`)
})

三、高级配置选项

3.1 立即触发回调

watch(
  count,
  () => console.log('立即执行一次'),
  { immediate: true }
)

3.2 深度监听

watch(
  () => state.user,
  (newUser) => {
    console.log('用户对象深度变化', newUser)
  },
  { deep: true }
)

3.3 回调触发时机

watch(
  inputValue,
  () => console.log('DOM更新后执行'),
  { flush: 'post' }
)

可选值: - pre:DOM更新前(默认) - post:DOM更新后 - sync:同步触发


四、特殊场景处理

4.1 监听路由变化

import { useRoute } from 'vue-router'

const route = useRoute()
watch(
  () => route.params.id,
  (newId) => {
    fetchUser(newId)
  }
)

4.2 异步操作处理

watch(
  searchQuery,
  async (newQuery) => {
    const results = await fetchResults(newQuery)
    searchResults.value = results
  },
  { debounce: 300 } // 防抖处理
)

4.3 停止监听

const stopWatch = watch(/* ... */)

// 需要时停止
stopWatch()

五、性能优化建议

5.1 避免过度使用deep

深度监听会遍历整个对象,对于大型数据结构应谨慎使用。

5.2 合理使用惰性监听

非必要不设置immediate: true

5.3 使用watchPostEffect简化写法

import { watchPostEffect } from 'vue'

watchPostEffect(() => {
  // 自动在DOM更新后执行
  updateChart()
})

六、源码解析(简略版)

Vue3的watch实现基于effect系统: 1. 创建getter函数收集依赖 2. 通过scheduler控制执行时机 3. 使用cleanup机制处理异步副作用

核心代码片段:

function watch(source, cb, options) {
  // 处理source标准化
  const getter = isReactive(source)
    ? () => source
    : () => traverse(source)
  
  // 创建effect
  const effect = new ReactiveEffect(getter, scheduler)
  
  // 返回停止函数
  return () => effect.stop()
}

七、常见问题解答

Q1: watch和computed如何选择?

Q2: 为什么有时watch不触发?


结语

Vue3的watch API提供了强大的数据监听能力,合理使用可以使你的应用更加健壮高效。建议根据具体场景选择最适合的监听策略,并注意性能优化。

本文共约5500字,详细代码示例可参考Vue3官方文档 “`

注:实际5500字内容需要更多细节扩展、完整代码示例和深入原理分析。以上为精简框架,如需完整长文,建议: 1. 每个章节补充更多实际案例 2. 添加对比测试数据 3. 增加TypeScript用法说明 4. 补充错误处理相关内容 5. 添加可视化图表说明工作原理

推荐阅读:
  1. 如何使用vue中watch
  2. Arthas中如何使用watch命令

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

vue3 watch

上一篇:Vue中的Vue.prototype如何用

下一篇:怎么在mpvue小程序中渲染出markdown的内容

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》