vue-watch监听功能(侦听器)详解&使用

在Vue中,watch侦听器允许我们观察和响应Vue实例上数据的变化。当被侦听的数据发生变化时,可以执行异步操作或开销较大的操作,这是computed属性可能不适合的场景。watch侦听器提供了更灵活的方式来处理数据变化时的副作用。

基本用法

watch选项是一个对象,其键是需要观察的表达式(字符串形式),值是对应回调函数。当表达式的值发生变化时,会调用这个回调函数。回调函数接收两个参数:新值和旧值。

复制代码

javascript复制代码

|---|--------------------------------------------------------------------|
| | export default { |
| | data() { |
| | return { |
| | question: '', |
| | answer: 'I cannot give you an answer until you ask a question!' |
| | } |
| | }, |
| | watch: { |
| | // 侦听question的变化 |
| | question(newVal, oldVal) { |
| | this.answer = 'Waiting for you to stop typing...'; |
| | this.debouncedGetAnswer(); |
| | } |
| | }, |
| | created() { |
| | // 使用lodash的debounce函数来限制getAnswer的调用频率 |
| | this.debouncedGetAnswer = _.debounce(this.getAnswer, 500); |
| | }, |
| | methods: { |
| | getAnswer() { |
| | if (this.question.includes('?')) { |
| | this.answer = 'Thinking...'; |
| | // 这里模拟异步操作 |
| | setTimeout(() => { |
| | this.answer = 'Answered ' + this.question; |
| | }, 1000); |
| | } |
| | } |
| | } |
| | } |

深度侦听

当需要侦听一个对象的属性时,标准的watch侦听器可能不会按预期工作,因为默认情况下,它不会侦听对象内部属性的变化。为了侦听对象内部属性的变化,可以使用deep: true选项。

复制代码

javascript复制代码

|---|------------------------------|
| | watch: { |
| | someObject: { |
| | handler(newVal, oldVal) { |
| | // 当someObject内部任何属性变化时执行 |
| | }, |
| | deep: true |
| | } |
| | } |

立即执行

有时,你可能希望侦听器在组件创建后立即执行一次,而不是等待数据变化。这可以通过immediate: true选项来实现。

复制代码

javascript复制代码

|---|-----------------------------------|
| | watch: { |
| | someData: { |
| | handler(newVal, oldVal) { |
| | // 侦听逻辑 |
| | }, |
| | immediate: true // 组件创建时立即执行一次 |
| | } |
| | } |

注意事项

  • watch侦听器适用于观察数据变化后执行复杂逻辑或异步操作。
  • 过度使用watch可能会使组件难以理解和维护,特别是在大型项目中。
  • 当需要基于数据变化来更新数据时,通常优先考虑使用computed属性,因为它更高效且声明式。
  • 使用deep: true时要小心,因为它会深度遍历对象,这可能会导致性能问题。
  • immediate: true在某些情况下很有用,但也要谨慎使用,因为它会在侦听器创建后立即执行一次,这可能会与组件的初始渲染逻辑冲突。
相关推荐
用户9385156350736 分钟前
从零搭建 AI 日记助手:用 Milvus 向量数据库 + RAG 让机器读懂你的每一天
javascript·人工智能·全栈
徐小夕1 小时前
花了一周,3亿tokens,我开源了一款 Word 文档智能审查平台,文稿自动质检+可视化分析,告别低效人工审核
前端·算法·github
a1117762 小时前
坦克大战3D Three.js 3D (开源项目)
开发语言·javascript·3d
kyriewen3 小时前
别再乱用useEffect了——你写的10个里有8个不该存在
前端·javascript·react.js
Ivanqhz3 小时前
Rust &‘static str浅析
java·前端·javascript·rust
IT_陈寒4 小时前
SpringBoot这个分页坑,我踩了三天才爬出来
前端·人工智能·后端
颜酱4 小时前
05 | 召回前置准备:根据业务数据库生成各数据库(读取配置阶段)
前端·人工智能·后端
zandy10114 小时前
衡石 Agentic BI的ReAct 推理框架在 Agentic BI 中的工程化实践
前端·javascript·react.js
罗超驿4 小时前
JavaEE进阶之路:从Web架构原理到HTML标签全解析
前端·html·web·javaee
西安小哥4 小时前
从前端到AI工程师:一场跨越鸿沟的真实蜕变之旅
前端