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 elementUI 使用el-select 时 change事件的触发问题
Nov 17 Vue.js
Vue项目如何引入bootstrap、elementUI、echarts
Nov 26 Vue.js
梳理一下vue中的生命周期
Dec 30 Vue.js
通过vue.extend实现消息提示弹框的方法记录
Jan 07 Vue.js
浅谈Vue开发人员的7个最好的VSCode扩展
Jan 20 Vue.js
vue中axios封装使用的完整教程
Mar 03 Vue.js
浅谈vue2的$refs在vue3组合式API中的替代方法
Apr 18 Vue.js
springboot+VUE实现登录注册
May 27 Vue.js
vue 实现上传组件
May 31 Vue.js
vue中利用mqtt服务端实现即时通讯的步骤记录
Jul 01 Vue.js
详解Vue项目的打包方式(生成dist文件)
Jan 18 Vue.js
vue+iview实现手机号分段输入框
Mar 25 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 操作调试的方法
2012/07/12 PHP
PHP定时任务延缓执行的实现
2014/10/08 PHP
php中常见的sql攻击正则表达式汇总
2014/11/06 PHP
PHP实现的构造sql语句类实例
2016/02/03 PHP
javascript与asp.net(c#)互相调用方法
2009/12/13 Javascript
基于JQuery.timer插件实现一个计时器
2010/04/25 Javascript
Jquery+WebService 校验账号是否已被注册的代码
2010/07/12 Javascript
javascript拓展DOM操作 prependChild insertAfert
2010/11/17 Javascript
jQuery如何防止这种冒泡事件发生
2015/02/27 Javascript
jQuery插件EnPlaceholder实现输入框提示文字
2015/06/05 Javascript
JavaScript函数中关于valueOf和toString的理解
2016/06/14 Javascript
省市区三级联动jquery实现代码
2020/04/15 Javascript
webpack+vuex+axios 跨域请求数据的示例代码
2018/03/06 Javascript
让webpack+vue-cil项目不再自动打开浏览器的方法
2018/09/27 Javascript
如何使用 vue + d3 画一棵树
2018/12/03 Javascript
小程序实现自定义导航栏适配完美版
2019/04/02 Javascript
JS实现利用闭包判断Dom元素和滚动条的方向示例
2019/08/26 Javascript
解决vue打包后刷新页面报错:Unexpected token
2019/08/27 Javascript
Vue使用虚拟dom进行渲染view的方法
2019/12/26 Javascript
JavaScript实现滑动门效果
2020/01/18 Javascript
js实现双色球效果
2020/08/02 Javascript
[57:22]完美世界DOTA2联赛PWL S2 FTD vs PXG 第二场 11.27
2020/12/01 DOTA
Python中使用dom模块生成XML文件示例
2015/04/05 Python
python绘制立方体的方法
2018/07/02 Python
Pytorch使用MNIST数据集实现CGAN和生成指定的数字方式
2020/01/10 Python
Python实现井字棋小游戏
2020/03/09 Python
HEMA法国:荷兰原创设计
2019/02/21 全球购物
医生实习工作总结的自我评价
2013/09/27 职场文书
质检部岗位职责
2013/11/11 职场文书
应届毕业生个人求职自荐信
2014/01/06 职场文书
公务员综合考察材料
2014/02/01 职场文书
班训口号大全
2014/06/18 职场文书
2014年实习生工作总结
2014/11/27 职场文书
义卖募捐活动总结
2015/05/09 职场文书
React 并发功能体验(前端的并发模式)
2021/07/01 Javascript
Python 数据可视化神器Pyecharts绘制图像练习
2022/02/28 Python