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项目如何引入bootstrap、elementUI、echarts
Nov 26 Vue.js
ESLint 是如何检查 .vue 文件的
Nov 30 Vue.js
如何在VUE中使用vue-awesome-swiper
Jan 04 Vue.js
使用vue3重构拼图游戏的实现示例
Jan 25 Vue.js
vue实现锚点定位功能
Jun 29 Vue.js
Vue3.0 手写放大镜效果
Jul 25 Vue.js
SSM VUE Axios详解
Oct 05 Vue.js
vue实力踩坑之push当前页无效
Apr 10 Vue.js
vue postcss-px2rem 自适应布局
May 15 Vue.js
Vue 打包后相对路径的引用问题
Jun 05 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
《五等分的花嫁》漫画完结!2020年10月第2期TV动画制作组换血!
2020/03/06 日漫
PHP 二维array转换json的实例讲解
2018/08/21 PHP
ztree获取当前选中节点子节点id集合的方法
2015/02/12 Javascript
JavaScript 动态加载脚本和样式的方法
2015/04/13 Javascript
JavaScript动态改变div属性的实现方法
2015/07/22 Javascript
JavaScript实现定时隐藏与显示图片的方法
2015/08/06 Javascript
JavaScript仿商城实现图片广告轮播实例代码
2016/02/06 Javascript
BootStrap.css 在手机端滑动时右侧出现空白的原因及解决办法
2016/06/07 Javascript
AngularJS基础 ng-keyup 指令简单示例
2016/08/02 Javascript
使用ajaxfileupload.js实现上传文件功能
2016/08/13 Javascript
bootstrap警告框示例代码分享
2017/05/17 Javascript
利用百度地图API获取当前位置信息的实例
2017/11/06 Javascript
Vue和React组件之间的传值方式详解
2019/01/31 Javascript
vue中axios请求的封装实例代码
2019/03/23 Javascript
el-select 下拉框多选实现全选的实现
2019/08/02 Javascript
浅谈layui里的上传控件问题
2019/09/26 Javascript
JS实现前端动态分页码代码实例
2020/06/02 Javascript
vue实现移动端项目多行文本溢出省略
2020/07/29 Javascript
JavaScript如何实现防止重复的网络请求的示例
2021/01/28 Javascript
[03:18]【TI9纪实】社区大触GL与木木
2019/08/25 DOTA
Python中replace方法实例分析
2014/08/20 Python
独特的python循环语句
2016/11/20 Python
python中numpy包使用教程之数组和相关操作详解
2017/07/30 Python
Python实现屏幕截图的两种方式
2018/02/05 Python
python 获取文件下所有文件或目录os.walk()的实例
2018/04/23 Python
python 阶乘累加和的实例
2019/02/01 Python
Python3安装Pillow与PIL的方法
2019/04/03 Python
Django+zTree构建组织架构树的方法
2019/08/21 Python
Django import export实现数据库导入导出方式
2020/04/03 Python
利用Python如何实时检测自身内存占用
2020/05/09 Python
Python实现一个论文下载器的过程
2021/01/18 Python
美国打印机墨水和碳粉购物网站:QuikShip Toner
2018/08/29 全球购物
英国豪华家具和经典家居饰品购物网站:OKA
2020/06/05 全球购物
大学生军训感想
2014/02/16 职场文书
作文批改评语大全
2014/04/23 职场文书
充分就业社区汇报材料
2014/05/07 职场文书