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的Message和MessageBox的示例
Nov 20 Vue.js
vue element-ul实现展开和收起功能的实例代码
Nov 25 Vue.js
vue-cli4.0多环境配置变量与模式详解
Dec 30 Vue.js
如何在vue-cli中使用css-loader实现css module
Jan 07 Vue.js
Vue实现多页签组件
Jan 14 Vue.js
Vue 数据响应式相关总结
Jan 28 Vue.js
vue登录页实现使用cookie记住7天密码功能的方法
Feb 18 Vue.js
Vue CLI中模式与环境变量的深入详解
May 30 Vue.js
vue+elementui 实现新增和修改共用一个弹框的完整代码
Jun 08 Vue.js
vue实现滑动解锁功能
Mar 03 Vue.js
Vue2.0搭建脚手架
Mar 13 Vue.js
vue.js 使用原生js实现轮播图
Apr 26 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
2019年漫画销量排行榜:鬼灭登顶 海贼单卷制霸 尾田盛赞鬼灭
2020/03/08 日漫
php+memcache实现的网站在线人数统计代码
2014/07/04 PHP
PHP 魔术变量和魔术函数详解
2015/02/25 PHP
PHP递归删除多维数组中的某个值
2017/04/17 PHP
PHP实现生成模糊图片的方法示例
2017/12/21 PHP
php语言注释,单行注释和多行注释
2018/01/21 PHP
PHP实现Redis单据锁以及防止并发重复写入
2018/04/10 PHP
javascript操作数组详解
2014/12/17 Javascript
javascript控制层显示或隐藏的方法
2015/07/22 Javascript
jQuery动画效果图片轮播特效
2016/01/12 Javascript
Google Maps基础及实例解析
2016/08/06 Javascript
JavaScript与java语言有什么不同
2016/09/22 Javascript
浅谈js控制li标签排序问题 js调用php函数的方法
2016/10/16 Javascript
JS实现的图片预览插件与用法示例【不上传图片】
2016/11/25 Javascript
javascript容错处理代码(屏蔽js错误)
2017/01/20 Javascript
vue 每次渲染完页面后div的滚动条保持在最底部的方法
2018/03/17 Javascript
JS实现获取毫秒值及转换成年月日时分秒的方法
2018/08/15 Javascript
微信小程序上线发布流程图文详解
2019/05/06 Javascript
Python中实现参数类型检查的简单方法
2015/04/21 Python
Python实现监控程序执行时间并将其写入日志的方法
2015/06/30 Python
Python+matplotlib实现华丽的文本框演示代码
2018/01/22 Python
python异常触发及自定义异常类解析
2019/08/06 Python
python 发送json数据操作实例分析
2019/10/15 Python
python元组的概念知识点
2019/11/19 Python
推荐8款常用的Python GUI图形界面开发框架
2020/02/23 Python
Python爬虫抓取论坛关键字过程解析
2020/10/19 Python
html5 Canvas画图教程(3)—canvas出现1像素线条模糊不清的原因
2013/01/09 HTML / CSS
美国女孩洋娃娃店:American Girl
2017/10/24 全球购物
KARATOV珠宝在线商店:俄罗斯珠宝品牌
2019/03/13 全球购物
运动会开幕式邀请函
2014/02/03 职场文书
生物制药专业自我鉴定
2014/02/19 职场文书
班组长岗位职责
2014/03/03 职场文书
预防艾滋病宣传标语
2014/06/25 职场文书
2014年派出所工作总结
2014/11/21 职场文书
高中班主任寄语
2019/06/21 职场文书
《弟子规》读后感:知廉耻、明是非、懂荣辱、辨善恶
2019/12/03 职场文书