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
vue实现广告栏上下滚动效果
Nov 26 Vue.js
vue3.0中setup使用(两种用法)
Dec 02 Vue.js
vue添加自定义右键菜单的完整实例
Dec 08 Vue.js
详解Vue的异步更新实现原理
Dec 22 Vue.js
vue+element table表格实现动态列筛选的示例代码
Jan 14 Vue.js
Vue+Bootstrap实现简易学生管理系统
Feb 09 Vue.js
基于vue的video播放器的实现示例
Feb 19 Vue.js
vue前端工程的搭建
Mar 31 Vue.js
Vue如何实现组件间通信
May 15 Vue.js
解读Vue组件注册方式
May 15 Vue.js
vue项目打包后路由错误的解决方法
Apr 13 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/07/16 PHP
Laravel 5框架学习之用户认证
2015/04/09 PHP
删除PHP数组中头部、尾部、任意元素的实现代码
2017/04/10 PHP
ie下动态加态js文件的方法
2011/09/13 Javascript
让ie6也支持websocket采用flash封装实现
2013/02/18 Javascript
在js文件中如何获取basePath处理js路径问题
2013/07/10 Javascript
javascript实现动态侧边栏代码
2014/02/19 Javascript
原生js页面滚动延迟加载图片
2015/12/20 Javascript
悬浮广告方法日常收集整理
2016/03/18 Javascript
js中字符串编码函数escape()、encodeURI()、encodeURIComponent()区别详解
2016/04/01 Javascript
简单封装js的dom查询实例代码
2016/07/08 Javascript
判断js的Array和Object的实现方法
2016/08/29 Javascript
ReactJs快速入门教程(精华版)
2016/11/28 Javascript
Vuex2.0+Vue2.0构建备忘录应用实践
2016/11/30 Javascript
详解nodeJS之二进制buffer对象
2017/06/03 NodeJs
详解NODEJS的http实现
2018/01/04 NodeJs
解决js相同的正则多次调用test()返回的值却不同的问题
2018/10/10 Javascript
layer弹出子iframe层父子页面传值的实现方法
2018/11/22 Javascript
简单的React SSR服务器渲染实现
2018/12/11 Javascript
分享Angular http interceptors 拦截器使用(推荐)
2019/11/10 Javascript
[02:05]DOTA2完美大师赛趣味视频之看我表演
2017/11/18 DOTA
[00:08]DOTA2勇士令状等级奖励“天外飞星”
2019/05/24 DOTA
Python备份Mysql脚本
2008/08/11 Python
零基础写python爬虫之抓取百度贴吧并存储到本地txt文件改进版
2014/11/06 Python
python脚本设置系统时间的两种方法
2016/02/21 Python
Python中进程和线程的区别详解
2017/10/29 Python
对numpy中轴与维度的理解
2018/04/18 Python
Python GUI学习之登录系统界面篇
2019/08/21 Python
使用python将excel数据导入数据库过程详解
2019/08/27 Python
Python大数据之使用lxml库解析html网页文件示例
2019/11/16 Python
销售文员的岗位职责
2013/11/20 职场文书
贷款委托书范本
2014/04/08 职场文书
延安红色之旅心得体会
2014/10/07 职场文书
工会2014法制宣传日活动总结
2014/11/01 职场文书
道德与公民自我评价
2015/03/09 职场文书
JS前端轻量fabric.js系列之画布初始化
2022/08/05 Javascript