场景引入:
小明正在开发一个电商后台管理系统,商品对象长这样👇:
const product = reactive({ id: 123, details: { name: 'Vue限定款键盘', price: 399, stock: { warehouseA: 50, warehouseB: 30 } } })
现在有个需求:当price
变化时自动计算折扣价,直接watch(product, ...)
会触发所有属性变更,性能杀手啊!😱 别急,这就教你精准狙击深层属性!
对于第一层属性,直接写属性名即可:
watch( () => product.id, (newVal) => { console.log(`商品ID变成${newVal}啦~`) } )
👉 适用场景:简单数据变更提醒
用箭头函数返回具体路径,Vue会自动追踪:
watch( () => product.details.price, (newPrice) => { console.log(`价格更新为${newPrice},快重新计算折扣!`) } )
⚠️ 注意:如果details
被整个替换,监听会失效!
{ deep: true }
需要监听整个嵌套对象时:
watch( () => product.details, (newDetails) => { // 这里会响应details下任何变化 }, { deep: true } // 🚨 性能警告!慎用! )
如果想监听stock
下任意仓库库存变化:
watch( () => [product.details.stock.warehouseA, product.details.stock.warehouseB], ([newA, newB]) => { console.log(`仓库A:${newA} 仓库B:${newB}`) } )
💡 小技巧:用数组同时监听多个属性
deep
深层监听会递归遍历所有属性,数据量大时可能卡顿,推荐:
// 只监听需要的层级 watch( () => product.details.stock, () => { /* ... */ }, { deep: true } // 比监听整个product好多了 )
有些场景需要初始值也执行回调:
watch( () => product.details.price, (newVal) => { /* ... */ }, { immediate: true } // 🚀 页面加载就执行一次 )
watch( () => product.details, (newVal, oldVal) => { // 当修改details内部属性时,newVal和oldVal会相同! // 因为它们是同一个对象的引用 }, { deep: true } )
✅ 解决方案:用_.cloneDeep
拷贝旧值
const tags = reactive(['Vue', 'React']) watch( tags, () => { /* push/pop等操作可能不会触发 */ } )
✅ 正确姿势:
watch( () => [...tags], // 创建新数组 () => { /* 现在能捕获变化了 */ } )
:
deep
现在小明的价格监听器已经稳稳运行了,你的呢?😉 (2025-07最新实践验证)
本文由 艾梦菲 于2025-07-30发表在【云服务器提供商】,文中图片由(艾梦菲)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/484709.html
发表评论