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 19 Vue.js
用vue设计一个日历表
Dec 03 Vue.js
vue 在单页面应用里使用二级套嵌路由
Dec 19 Vue.js
vue 实现图片懒加载功能
Dec 31 Vue.js
vue.js实现点击图标放大离开时缩小的代码
Jan 27 Vue.js
vue 根据选择的月份动态展示日期对应的星期几
Feb 06 Vue.js
vue仿携程轮播图效果(滑动轮播,下方高度自适应)
Feb 11 Vue.js
Vue全家桶入门基础教程
May 14 Vue.js
vue-cropper插件实现图片截取上传组件封装
May 27 Vue.js
vue cli4中mockjs在dev环境和build环境的配置详情
Apr 06 Vue.js
vue组件冲突之引用另一个组件出现组件不显示的问题
Apr 13 Vue.js
vue里使用create, mounted调用方法
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
[转帖]PHP世纪万年历
2006/12/06 PHP
php file_get_contents函数轻松采集html数据
2010/04/22 PHP
PHP学习笔记之数组篇
2011/06/28 PHP
关于php连接mssql:pdo odbc sql server
2011/07/20 PHP
CI框架实现框架前后端分离的方法详解
2016/12/30 PHP
关于PHP内置的字符串处理函数详解
2017/02/04 PHP
Yii2实现跨mysql数据库关联查询排序功能代码
2017/02/10 PHP
PDO实现学生管理系统
2020/03/21 PHP
Thinkphp集成抖音SDK的实现方法
2020/04/28 PHP
js change,propertychange,input事件小议
2011/12/20 Javascript
两种常用的javascript数组去重方法思路及代码
2013/03/26 Javascript
调用innerHTML之后onclick失效问题的解决方法
2014/01/28 Javascript
JS实现控制表格行内容垂直对齐的方法
2015/03/30 Javascript
H5用户注册表单页 注册模态框!
2016/09/17 Javascript
nodejs密码加密中生成随机数的实例代码
2017/07/17 NodeJs
javascript 中事件冒泡和事件捕获机制的详解
2017/09/01 Javascript
vue解决跨域路由冲突问题思路解析
2017/11/03 Javascript
vue-cli开发时,关于ajax跨域的解决方法(推荐)
2018/02/03 Javascript
详解基于mpvue的小程序markdown适配解决方案
2018/05/08 Javascript
详解微信小程序支付流程与梳理
2019/07/16 Javascript
如何在Vue.JS中使用图标组件
2020/08/04 Javascript
[51:15]2014 DOTA2国际邀请赛中国区预选赛 Orenda VS LGD-GAMING
2014/05/22 DOTA
python实现sublime3的less编译插件示例
2014/04/27 Python
基于Python实现的百度贴吧网络爬虫实例
2015/04/17 Python
利用Python中unittest实现简单的单元测试实例详解
2017/01/09 Python
PyQt5中多线程模块QThread使用方法的实现
2020/01/31 Python
万得城电器土耳其网站:欧洲第一大电子产品零售商
2016/10/07 全球购物
教师自荐书
2013/10/08 职场文书
幼儿园中班教学反思
2014/02/10 职场文书
实习报告评语
2014/04/26 职场文书
公司任命书范本
2014/06/04 职场文书
家长意见和建议怎么写
2015/06/04 职场文书
党员反腐倡廉学习心得体会
2015/08/15 职场文书
2015年评职称个人工作总结
2015/10/15 职场文书
如何使用Python实现一个简易的ORM模型
2021/05/12 Python
Qt数据库应用之实现图片转pdf
2022/06/01 Java/Android