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 18 Vue.js
ESLint 是如何检查 .vue 文件的
Nov 30 Vue.js
vue中如何自定义右键菜单详解
Dec 08 Vue.js
Vue实现随机验证码功能
Dec 29 Vue.js
vue+element UI实现树形表格
Dec 29 Vue.js
vue中使用echarts的示例
Jan 03 Vue.js
vue组件是如何解析及渲染的?
Jan 13 Vue.js
vue穿梭框实现上下移动
Jan 29 Vue.js
vue+flask实现视频合成功能(拖拽上传)
Mar 04 Vue.js
vue+echarts实现多条折线图
Mar 21 Vue.js
vue实现可以快进后退的跑马灯组件
Apr 08 Vue.js
vue如何在data中引入图片的正确路径
Jun 05 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文件
2007/01/04 PHP
PHP表单验证的3个函数ISSET()、empty()、is_numeric()的使用方法
2011/08/22 PHP
PHP延迟静态绑定示例分享
2014/06/22 PHP
PHP采集静态页面并把页面css,img,js保存的方法
2014/12/23 PHP
PHP获取数组中单列值的方法
2017/06/10 PHP
javascript学习笔记(十一) 正则表达式介绍
2012/06/20 Javascript
jQuery实现新消息闪烁标题提示的方法
2015/03/11 Javascript
javascript数组去重的方法汇总
2015/04/14 Javascript
javascript控制层显示或隐藏的方法
2015/07/22 Javascript
情人节单身的我是如何在敲完代码之后收到12束玫瑰的(javascript)
2015/08/21 Javascript
jQuery网页定位导航特效实现方法
2016/12/19 Javascript
javascript设计模式之中介者模式学习笔记
2017/02/15 Javascript
详解Angular 中 ngOnInit 和 constructor 使用场景
2017/06/22 Javascript
gulp构建小程序的方法步骤
2019/05/31 Javascript
electron实现静默打印的示例代码
2019/08/12 Javascript
React学习之受控组件与数据共享实例分析
2020/01/06 Javascript
详解JavaScript中的数据类型,以及检测数据类型的方法
2020/09/17 Javascript
Python实现统计单词出现的个数
2015/05/28 Python
Python判断文件或文件夹是否存在的三种方法
2017/07/27 Python
Python装饰器原理与用法分析
2018/04/30 Python
解决seaborn在pycharm中绘图不出图的问题
2018/05/24 Python
解决pandas使用read_csv()读取文件遇到的问题
2018/06/15 Python
python如何获取当前文件夹下所有文件名详解
2019/01/25 Python
用Python从0开始实现一个中文拼音输入法的思路详解
2019/07/20 Python
websocket+sockjs+stompjs详解及实例代码
2018/11/30 HTML / CSS
美国最大的珠宝商之一:Littman Jewelers
2016/11/13 全球购物
ASOS西班牙官网:英国在线时尚和美容零售商
2020/01/10 全球购物
什么是TCP/IP
2014/07/27 面试题
企业军训感言
2014/02/08 职场文书
人力资源管理毕业求职信
2014/08/05 职场文书
出租车拒载检讨书
2015/01/28 职场文书
自主招生自荐信范文
2015/03/04 职场文书
审美与表现自我评价
2015/03/09 职场文书
通知的写法
2015/04/23 职场文书
读《瓦尔登湖》有感:每个人都需要一个瓦尔登湖
2019/10/17 职场文书
如何用JavaScript实现一个数组惰性求值库
2021/05/05 Javascript