vue.js watch经常失效的场景与解决方案


Posted in Vue.js onJanuary 07, 2021

使用过watch的,应该起码经历过一次失效。

比如,我们监听对象的时候,在没有踩坑之前,很容易这样写:

vue.js watch经常失效的场景与解决方案

但是,❌,这里的watch是无效的!!!

因为 obj 是引用类型!!!

引用类型的指针是固定的,所以如果不是重新赋值,那么其赋值的变量自然也不会发生变化。

举个例子:

let obj = { a: 1 };
let obj1 = obj;
let obj2 = { ...obj };
obj1.a = 2;
obj2.a = 3;
// 这里肯定是true,因为obj和obj1都是同一个指针,不明白的搜下引用类型
console.log(obj1 === obj);
// 这里肯定是false,因为指针不同
console.log(obj2 === obj);

怎么解决呢?也简单!

设置deep:true,这样obj中的属性发生变化(可被监测到的),便会执行 handler 函数;。

vue.js watch经常失效的场景与解决方案

!!!注意,因为是引用类型,所以newValue 和oldValue始终相等,千万不要犯傻的写相等就return,那就永远也不往下走了。。。。

监测数组

引用类型,除了对象,很容易想到数组,那数组是不是也需要这样写呢。
话分两头:

  • 数组项是对象类型,就需要deep
  • 数组项是值类型,就不需要deep

因为vue2里,数组被特殊处理了,跟 obj 不等同,所以需要分情况。

也就是数组项是值类型的话,直接这么写就行:

vue.js watch经常失效的场景与解决方案

对象类型的话,上面是不行的,先举个错误 ❌ 的例子:

vue.js watch经常失效的场景与解决方案

不打印的原理,依然是数组项是对象类型,想watch对象类型,必须加deep

正确做法 ✅:

watch:{
 arr: {
 handler(newValue) {
  // 这里就可以打印了
  console.log(newValue);
 },
 deep: true
 },
}

总结

watch失效的场景:

  • 对象类型
  • 数组项为对象类型的数组

解决方案:加deep:true。

watch的其他属性

总结

到此这篇关于vue.js watch经常失效的场景与解决方案的文章就介绍到这了,更多相关vue.js watch失效的场景与解决内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Vue.js 相关文章推荐
vue单元格多列合并的实现
Nov 26 Vue.js
vue中defineProperty和Proxy的区别详解
Nov 30 Vue.js
Vue router传递参数并解决刷新页面参数丢失问题
Dec 02 Vue.js
vue中封装axios并实现api接口的统一管理
Dec 25 Vue.js
Vue实现圆环进度条的示例
Feb 06 Vue.js
Vue中避免滥用this去读取data中数据
Mar 02 Vue.js
vue中三级导航的菜单权限控制
Mar 31 Vue.js
vue 实现上传组件
May 31 Vue.js
vue3获取当前路由地址
Feb 18 Vue.js
vue+iview实现手机号分段输入框
Mar 25 Vue.js
vue递归实现树形组件
Jul 15 Vue.js
vue3 自定义图片放大器效果的示例代码
Jul 23 Vue.js
通过vue.extend实现消息提示弹框的方法记录
Jan 07 #Vue.js
如何在vue-cli中使用css-loader实现css module
Jan 07 #Vue.js
vue3中轻松实现switch功能组件的全过程
Jan 07 #Vue.js
vue+elementui通用弹窗的实现(新增+编辑)
Jan 07 #Vue.js
详解Vue2的diff算法
Jan 06 #Vue.js
vuex的使用步骤
Jan 06 #Vue.js
vue3.0中友好使用antdv示例详解
Jan 05 #Vue.js
You might like
php zlib压缩和解压缩swf文件的代码
2008/12/30 PHP
php foreach 使用&(与运算符)引用赋值要注意的问题
2010/02/16 PHP
分享PHP header函数使用教程
2013/09/05 PHP
php5.3以后的版本连接sqlserver2000的方法
2014/07/28 PHP
syntaxhighlighter 使用方法
2007/07/02 Javascript
jquery中dom操作和事件的实例学习-表单验证
2011/11/30 Javascript
js数组中如何随机取出一个值
2014/06/13 Javascript
JS实现选中当前菜单后高亮显示的导航条效果
2015/10/15 Javascript
多种方式实现js图片预览
2016/12/12 Javascript
原生js实现新闻列表展开/收起全文功能
2017/01/20 Javascript
AngularJS 支付倒计时功能实现思路
2017/06/05 Javascript
vue.js移动数组位置,同时更新视图的方法
2018/03/08 Javascript
微信小程序仿美团城市选择
2018/06/06 Javascript
利用Bootstrap Multiselect实现下拉框多选功能
2019/04/08 Javascript
vue项目,代码提交至码云,iconfont的用法说明
2020/07/30 Javascript
[38:32]完美世界DOTA2联赛循环赛 Forest vs DM 第二场 11.06
2020/11/06 DOTA
python二分查找算法的递归实现方法
2016/05/12 Python
Python竟能画这么漂亮的花,帅呆了(代码分享)
2017/11/15 Python
在Python 不同级目录之间模块的调用方法
2019/01/19 Python
创建Django项目图文实例详解
2019/06/06 Python
OpenCV+face++实现实时人脸识别解锁功能
2019/08/28 Python
自适应线性神经网络Adaline的python实现详解
2019/09/30 Python
python中plt.imshow与cv2.imshow显示颜色问题
2020/07/16 Python
python如何实现DES加密
2020/09/21 Python
python 装饰器的基本使用
2021/01/13 Python
JPA的优势都有哪些
2013/07/04 面试题
幼儿园中班教学反思
2014/02/10 职场文书
技能竞赛活动方案
2014/02/21 职场文书
酒店管理求职信
2014/06/09 职场文书
2014个人反腐倡廉思想汇报
2014/09/15 职场文书
大学军训自我鉴定大全
2014/09/18 职场文书
计算机实训报告范文
2014/11/05 职场文书
高中升旗仪式主持词
2015/07/03 职场文书
本地通过nginx配置反向代理的全过程记录
2021/03/31 Servers
python模板入门教程之flask Jinja
2022/04/11 Python
关于Redis的主从复制及哨兵问题
2022/06/16 Redis