详解vue2 $watch要注意的问题

发布时间 - 2026-01-11 03:10:23    点击率:

使用$watch监听的时候,监听的数据是一个对象的时候,要注意几点:

监听组件内某个对象里面的某项属性时,不要监听对象,直接监听对象里面的属性(深度监听),只有直接监听这个对象里面的属性,只更新对象里面的属性时也能直接监听到此数组的变化。

data(){
return {
msgs : {
list:[1,2,3]
}
}
},
watch:{
msg(newVal,oldVal){
console.log(newVal);//(1)
},
"msg.list":function(newVal,oldVal){
console.log(newVal)//(2)
}
},
mounted(){
this.$set(this.msg,"list",[1,2,3,4]);//(1)不会打印,(2)会打印
this.$set(this,"msg",{list:[1,2,3,4]}//(1)会打印,(2)会打印
}

数据驱动基于Object.defineProperty()这个功能进行实现,在vue中的数据对象就用树来表示,树的每一个叶子节点都会用Object.defineProperty()来定义get/set方法,而在set方法执行的时候会执行watch方法,实现数据的监听。

我们可以监听树的任一叶子节点,当叶子节点数据发生变化的时候,会执行此叶子节点中监听的方法,同时下级以及下下级甚至更下级的叶子节点的监听方法也会执行(前提是对应的叶子节点数据也有改变).

如下

data(){
 return {
msgs:{
list:[1,2,3],
msg:'1'
}
 }
},
watch:{
msgs(newVal,oldVal){
console.log(newVal);//(1)
},
"msgs.list":function(newVal,oldVal){
console.log(newVal)//(2)
}
"msgs.msg":function(newVal,oldVal){
console.log(newVal)//(3)
}
},
mounted(){
//下面的例子一个一个实验,不要放在一起运行,会造成结果错误。当然也可以自己验证如何放在一起也能验证下面的结果是正确的。

this.$set(this.msgs,"list",[1,2,3,4]);//(1)(3)不会打印,(2)会打印
//分析:这个是更新msgs树中list叶子节点的数据,会触发到 “msgs.list”的监听方法,从而(2)被打印
this.$set(this,"msgs",{list:[1,2,3,5]});//(1)(2)(3)都会打印
//分析:这个是更新msgs中的根节点的数据,会触发“msgs”的监听方法,因根节点下面还有子节点,会继续往下遍历,发现list节点的数据也随之改变,由[1,2,3]=>[1,2,3,4],触发了“msgs.list”的监听方法,同理msg节点的数据从 "1"=>"undefined",也会触发“msgs.msg”的监听方法,所以(1)(2)(3)都会打印。
this.$set(this,"msgs",{list:[1,2,3,4],msg:"1"});//(1)(2)会打印,(3)不会打印
//分析:这个与上面不同的是msg节点的内容并没有改变,一直都是“1”,所以不会触发“msgs.msg”的监听方法,所以(3)没有打印,(1)(2)都会打印
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# vue2  # $watch  # watch用法  # watch  # vue 监听键盘回车事件详解 @keyup.enter || @keyup.enter.native  # vue监听键盘事件的快捷方法【推荐】  # vue点击input弹出带搜索键盘并监听该元素的方法  # Vue.js每天必学之计算属性computed与$watch  # vue.js中$watch的用法示例  # Vue.js 中的 $watch使用方法  # 深入理解vue.js中$watch的oldvalue与newValue  # 深入对Vue.js $watch方法的理解  # Vue.Js中的$watch()方法总结  # vue自定义键盘信息、监听数据变化的方法示例【基于vm.$watch】  # 也会  # 也能  # 放在一起  # 的是  # 都是  # 是一个  # 也有  # 遍历  # 而在  # 我们可以  # 要注意  # 几点  # 就用  # 会用  # 往下  # 到此  # 大家多多  # 某项  # 结果是  # js 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  Laravel中的withCount方法怎么高效统计关联模型数量  Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】  百度浏览器网页无法复制文字怎么办 百度浏览器复制修复  javascript中闭包概念与用法深入理解  1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤  如何快速搭建个人网站并优化SEO?  Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理  html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】  北京专业网站制作设计师招聘,北京白云观官方网站?  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】  活动邀请函制作网站有哪些,活动邀请函文案?  html5的keygen标签为什么废弃_替代方案说明【解答】  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  电商网站制作价格怎么算,网上拍卖流程以及规则?  宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法  node.js报错:Cannot find module 'ejs'的解决办法  实例解析angularjs的filter过滤器  javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】  如何为不同团队 ID 动态生成多个独立按钮  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  如何在橙子建站上传落地页?操作指南详解  香港服务器建站指南:免备案优势与SEO优化技巧全解析  如何快速辨别茅台真假?关键步骤解析  javascript基本数据类型及类型检测常用方法小结  JavaScript中的标签模板是什么_它如何扩展字符串功能  java中使用zxing批量生成二维码立牌  Laravel storage目录权限问题_Laravel文件写入权限设置  Laravel如何实现模型的全局作用域?(Global Scope示例)  如何在服务器上配置二级域名建站?  高防服务器:AI智能防御DDoS攻击与数据安全保障  Laravel如何使用Passport实现OAuth2?(完整配置步骤)  什么是javascript作用域_全局和局部作用域有什么区别?  详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点  Python自动化办公教程_ExcelWordPDF批量处理案例  Laravel如何与Inertia.js和Vue/React构建现代单页应用  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析  简单实现jsp分页  微信推文制作网站有哪些,怎么做微信推文,急?  如何用美橙互联一键搭建多站合一网站?  如何彻底删除建站之星生成的Banner?  Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程  Python文件流缓冲机制_IO性能解析【教程】  Swift中switch语句区间和元组模式匹配