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中echarts的用法及与elementui-select的协同绑定操作
Nov 17 Vue.js
Vue项目如何引入bootstrap、elementUI、echarts
Nov 26 Vue.js
vue中defineProperty和Proxy的区别详解
Nov 30 Vue.js
Vue如何跨组件传递Slot的实现
Dec 14 Vue.js
Vue组件简易模拟实现购物车
Dec 21 Vue.js
Vue如何实现变量表达式选择器
Feb 18 Vue.js
Vue3 Composition API的使用简介
Mar 29 Vue.js
一文带你理解vue创建一个后台管理系统流程(Vue+Element)
May 18 Vue.js
Vue过滤器(filter)实现及应用场景详解
Jun 15 Vue.js
vue整合百度地图显示指定地点信息
Apr 06 Vue.js
vue-cil之axios的二次封装与proxy反向代理使用说明
Apr 07 Vue.js
Vue组件化(ref,props, mixin,.插件)详解
May 15 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/10/09 PHP
php下删除字符串中HTML标签的函数
2008/08/27 PHP
PHP 使用pcntl和libevent 实现Timer功能
2013/10/27 PHP
php输出1000以内质数(素数)示例
2014/02/16 PHP
php简单复制文件的方法
2016/05/09 PHP
Thinkphp开发--集成极光推送
2017/09/15 PHP
php生成短网址/短链接原理和用法实例分析
2020/05/29 PHP
转一个日期输入控件,支持FF
2007/04/27 Javascript
在一个浏览器里呈现所有浏览器测试结果的前端测试工具的思路
2010/03/02 Javascript
JavaScript 对象的属性和方法4种不同的类型
2010/03/19 Javascript
Javascript的并行运算实现代码
2010/11/19 Javascript
JavaScript获取和设置CheckBox状态的简单方法
2013/07/05 Javascript
jQuery实现动态添加和删除一个div
2015/08/12 Javascript
javascript实现图片延迟加载方法汇总(三种方法)
2015/08/27 Javascript
JavaScript实现下拉菜单的显示和隐藏
2016/01/05 Javascript
AngularJS 使用 UI Router 实现表单向导
2016/01/29 Javascript
JavaScript中点击事件的写法
2016/06/28 Javascript
JS获得一个对象的所有属性和方法实例
2017/02/21 Javascript
[38:41]2014 DOTA2国际邀请赛中国区预选赛 LGD VS CNB
2014/05/22 DOTA
[01:06:54]DOTA2-DPC中国联赛 正赛 RNG vs Dragon BO3 第一场 1月24日
2021/03/11 DOTA
使用Python对IP进行转换的一些操作技巧小结
2015/11/09 Python
python 禁止函数修改列表的实现方法
2017/08/03 Python
浅谈python for循环的巧妙运用(迭代、列表生成式)
2017/09/26 Python
python3监控CentOS磁盘空间脚本
2018/06/21 Python
对Python 获取类的成员变量及临时变量的方法详解
2019/01/22 Python
Python玩转加密的技巧【推荐】
2019/05/13 Python
在Django中实现添加user到group并查看
2019/11/18 Python
毕业生多媒体设计求职信
2013/10/12 职场文书
项目专员岗位职责
2013/12/04 职场文书
交通事故调解协议书
2014/04/16 职场文书
设计师求职信模板
2014/05/06 职场文书
演讲稿格式范文
2014/05/19 职场文书
广场舞大赛策划方案
2014/05/31 职场文书
2015年效能监察工作总结
2015/04/23 职场文书
教师研修随笔感言
2015/11/18 职场文书
MySQL解决Navicat设置默认字符串时的报错问题
2022/06/16 MySQL