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.js桌面端自定义滚动条组件之美化滚动条VScroll
Dec 01 Vue.js
解决Vue-cli3没有vue.config.js文件夹及配置vue项目域名的问题
Dec 04 Vue.js
vue使用exif获取图片旋转,压缩的示例代码
Dec 11 Vue.js
vue实现图书管理系统
Dec 29 Vue.js
vue实现树状表格效果
Dec 29 Vue.js
vue element el-transfer增加拖拽功能
Jan 15 Vue.js
vue-resource 拦截器interceptors使用详解
Jan 18 Vue.js
vue穿梭框实现上下移动
Jan 29 Vue.js
vue中h5端打开app(判断是安卓还是苹果)
Feb 26 Vue.js
HTML+VUE分页实现炫酷物联网大屏功能
May 27 Vue.js
vue实现拖拽交换位置
Apr 07 Vue.js
vue组件vue-esign实现电子签名
Apr 21 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 xml常用函数的集合(比较详细)
2013/06/06 PHP
PHP addcslashes()函数讲解
2019/02/03 PHP
ext实现完整的登录代码
2008/08/08 Javascript
工作中常用到的JS表单验证代码(包括例子)
2010/11/11 Javascript
将两个div左右并列显示并实现点击标题切换内容
2013/10/22 Javascript
jquery实现树形二级菜单实例代码
2013/11/20 Javascript
js和jquery如何获取图片真实的宽度和高度
2014/09/28 Javascript
jQuery实现横向带缓冲的水平运动效果(附demo源码下载)
2016/01/29 Javascript
jquery插件autocomplete用法示例
2016/07/01 Javascript
javascript比较语义化版本号的实现代码
2016/09/09 Javascript
JavaScript和jQuery获取input框的绝对位置实现方法
2016/10/13 Javascript
解决前端跨域问题方案汇总
2016/11/20 Javascript
Vue.js系列之项目结构说明(2)
2017/01/03 Javascript
jQuery实现点击下拉框中的值累加到文本框中的方法示例
2017/10/28 jQuery
微信小程序实现列表下拉刷新上拉加载
2020/07/29 Javascript
Vue下滚动到页面底部无限加载数据的示例代码
2018/04/22 Javascript
详解node.js的http模块实例演示
2018/07/12 Javascript
浅析Proxy可以优化vue的数据监听机制问题及实现思路
2018/11/29 Javascript
JavaScript正则表达式验证登录实例
2020/03/18 Javascript
Python版实现微信公众号扫码登陆
2020/05/28 Javascript
Python的Asyncore异步Socket模块及实现端口转发的例子
2016/06/14 Python
Python实现简单http服务器
2018/04/12 Python
Python3实现爬虫爬取赶集网列表功能【基于request和BeautifulSoup模块】
2018/12/05 Python
Python mutiprocessing多线程池pool操作示例
2019/01/30 Python
python调用pyaudio使用麦克风录制wav声音文件的教程
2019/06/26 Python
django写用户登录判定并跳转制定页面的实例
2019/08/21 Python
如何基于Python Matplotlib实现网格动画
2020/07/20 Python
Debenhams爱尔兰:英国知名的百货公司
2017/01/02 全球购物
全球速卖通:AliExpress(国际版淘宝)
2017/09/20 全球购物
历史专业个人求职信分享
2013/12/20 职场文书
王力宏牛津大学演讲稿
2014/05/22 职场文书
新教师个人工作总结
2015/02/06 职场文书
董事长秘书岗位职责
2015/02/13 职场文书
你真的了解PHP中的引用符号(&)吗
2021/05/12 PHP
世界十大儿童漫画书排名,法国国宝漫画排第五,第二是轰动日本连环
2022/03/18 欧美动漫
Windows server 2003卸载和安装IIS的图文教程
2022/07/15 Servers