当前位置: 首页 > news >正文

Vue 3 Watch 监听 Props 的踩坑记录

问题描述

最近在写一个基础下拉组件时,遇到了一个关于 watch 监听 props 值变化的问题。起初的代码是这样的:

// ❌ 错误示例
watch([options, props.modelValue], ([newOptions, newModelValue]) => {// 发现无法正确获取到 props.modelValue 的最新值
})

问题分析

在排查过程中发现,直接使用 props.modelValue 作为监听源时,只能获取到 props 的初始值,而无法检测到后续的变化。

解决方案

经过查阅 Vue 3 文档和社区讨论,发现需要使用箭头函数来包装 props 值:

// ✅ 正确示例
watch([options, () => props.modelValue], ([newOptions, newModelValue]) => {// 现在可以正确获取到 props.modelValue 的最新值了
})

原理解析

不使用箭头函数时

const value = props.modelValue;  // 直接访问,只获取一次值
watch(value, () => {})  // 监听的是一个静态值

使用箭头函数时

const getter = () => props.modelValue;  // 创建 getter 函数
watch(getter, () => {})  // 每次都会重新执行 getter 获取最新值

 响应式追踪示例

// 在组件中的实际应用
watch([options,  // ref 对象可以直接监听() => props.modelValue  // props 需要通过 getter 函数监听],([newOptions, newValue]) => {// 能够正确响应两个值的变化}
)

总之,使用箭头函数可以确保:

  1. 正确追踪响应式依赖
  2. 每次都能获取到最新的 prop 值
  3. 保持响应式系统的完整性

总结

  1. 监听 ref/reactive 对象:可以直接使用
  2. 监听 props:使用箭头函数包装
  3. 需要深度监听时:添加 { deep: true } 配置

相关文章:

  • Git常用操作命令
  • Qt 下载的地址集合
  • 【Maven】配置文件
  • audio 核心服务AudioPolicyService 和AudioFlinger启动流程
  • jsconfig.json文件的作用
  • 【SAP-CO】生产的成本流转和成本分析
  • Spark-Streaming
  • 【深度学习新浪潮】新视角生成的研究进展调研报告(2025年4月)
  • 软件测试之接口测试常见面试
  • 第48讲:空间大数据与智慧农业——时空大数据分析与农业物联网的融合实践
  • ecovadis评级范围,如何拿到ecovadis评级高分
  • 局域网内,将linux(Ubuntu)的硬盘映射成Windows上,像本地磁盘一样使用
  • 健康生活新指南
  • ESM 内功心法:化解 require 中的夺命一击!
  • Spring 中 @Component, @Repository, @Service 的区别及示例代码
  • 学习Docker遇到的问题
  • 广州市白云区粤荣职业培训学校副校长余智强获聘广州培训质量督导员
  • 高性能数据库集群:分库分表
  • LeetCode 热题 100_分割等和子集(89_416_中等_C++)(动态规划)
  • 如何通过证书认证安全登录堡垒机、防火墙和VPN?安当KSP密钥管理系统助力企业实现零信任身份验证
  • 特斯拉一季度净利下滑七成,马斯克表态将继续倡导关税下调
  • 2025年一季度上海市生产总值
  • 男粉丝咬伤女主播嘴后写的条子引争议:赔偿“十万元”还是“十5元”?
  • “中华优秀科普图书榜”2024年度榜单揭晓
  • 秦洪看盘|热点凌乱难抑多头雄心
  • 受贿超8.22亿元,新疆维吾尔自治区党委原副书记李鹏新一审被判死缓