解决vue无法侦听数组及对象属性的变化问题


Posted in Javascript onJuly 17, 2020

一、数组

1、可以监听到的情况

如push、splice、=赋值(array=[1,2,3])

2、无法监听到的情况

使用下标修改某个元素(这种比较常见)

array[index] = 1

object.a = 3

直接修改数组length

array.length = 5

3、解决方案

this.$set(array, index, data) - 这是个深度的修改,某些情况下可能导致你不希望的结果,因此最好还是慎用
this.dataArr = this.originArr
this.$set(this.dataArr, 0, {data: '修改第一个元素'})
console.log(this.dataArr)    
console.log(this.originArr)    //同样的 源数组也会被修改 在某些情况下会导致你不希望的结果

上面提到的splice方法进行增删改

利用临时变量进行中转

let tempArr = [...this.targetArr]
tempArr[0] = {data: 'test'}
this.targetArr = tempArr

二、对象

对象和数组都是js里的引用类型,在实际存储中,数据是存储在堆中的,利用存储在栈里的对象名或者数组名的指针进行索引,因此也存在在浅拷贝和深拷贝以及等号赋值时,到底是仅仅新建了一个指针指向了同一份数据,还是两个指针分别指向了两份完全一样的数据的问题

1、可以监听到的

对象的直接=赋值

this.obj = {name: 'test'}

2、无法监听到的

对象属性的增删改

obj: {
  prop1: 'data1',
  prop2: 'data2'
}
...
// 增
this.obj.prop3 = 'data3'
// 删
delete this.obj.prop1
// 改
this.obj.prop1 = 'data4'

3、解决办法

this.$set(obj, key ,value) - 可实现增、改
watch时添加deep:true深度监听,只能监听到属性值的变化,新增、删除属性无法监听
this.$watch('blog', this.getCatalog, {
  deep: true
  // immediate: true // 是否第一次触发
 });
watch时直接监听某个key
watch: {
 'obj.name'(curVal, oldVal) {
  // TODO
 }
}
object.assign()+直接=赋值
this.watchObj = Object.assign({}, this.watchObj, {
 name: 'xiaoyue',
 age: 15,
});

补充知识:vue 监听不到数组或对象值的变化怎么办

一、vue监听数组的变化

vue能购监听到数组变化的场景

通过赋值的形式改变正在被监听的数组;

通过splice(index, num, val) 的形式改变正在被监听的数组;

通过数组的push的形式改变正在被监听的数组。

vue无法监听数组变化的场景

通过数组索引改变数组元素的值;

改变数组的长度;

vue无法监听数组变化的场景

this.$set(arr, index, newVal);

通过splice(index,num,val);

使用临时变量作为中转,重新赋值数组;

二、vue监听对象的变化

vue能够监听到对象变化的场景

通过直接赋值的场景。

eg:watchObj = {name:“zyk”}

vue无法监听到对象变化的场景

对象的增加、删除、修改无法被vue监听到

vue解决无法监听对象变化的方法

使用 this.$set(object, key, value)(vue 无法监听 this.set 修改原有属性)

使用Object.assign(),直接赋值的原理;(推荐使用)

以上这篇解决vue无法侦听数组及对象属性的变化问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js利用div背景,做一个竖线的效果。
Nov 22 Javascript
Js 获取HTML DOM节点元素的方法小结
Apr 24 Javascript
自制轻量级仿jQuery.boxy对话框插件代码
Oct 26 Javascript
JQuery调webservice实现邮箱验证(检测是否可用)
May 21 Javascript
js特效,页面下雪的小例子
Jun 17 Javascript
离开当前页面前使用js判断条件提示是否要离开页面
May 02 Javascript
jQuery遍历对象、数组、集合实例
Nov 08 Javascript
javascript中对变量类型的判断方法
Aug 09 Javascript
jQuery ui autocomplete选择列表被Bootstrap模态窗遮挡的完美解决方法
Sep 23 Javascript
jquery attr()设置和获取属性值实例教程
Sep 25 Javascript
jQuery+ajax实现局部刷新的两种方法
Jun 08 jQuery
JS与SQL方式随机生成高强度密码示例
Dec 29 Javascript
使用element-ui +Vue 解决 table 里包含表单验证的问题
Jul 17 #Javascript
Vue element-ui父组件控制子组件的表单校验操作
Jul 17 #Javascript
简单了解常用的JavaScript 库
Jul 16 #Javascript
jQuery加PHP实现图片上传并提交的示例代码
Jul 16 #jQuery
浅谈js中的attributes和Attribute的用法与区别
Jul 16 #Javascript
JS自定义右键菜单实现代码解析
Jul 16 #Javascript
JS如何在不同平台实现多语言方式
Jul 16 #Javascript
You might like
用PHP动态创建Flash动画
2006/10/09 PHP
php str_pad() 将字符串填充成指定长度的字符串
2010/02/23 PHP
php array_udiff_assoc 计算两个数组的差集实例
2016/11/12 PHP
PHP内置加密函数详解
2016/11/20 PHP
实例讲解PHP表单处理
2019/02/15 PHP
由浅到深了解JavaScript类
2006/09/08 Javascript
HTML中Select不用Disabled实现ReadOnly的效果
2008/04/07 Javascript
深入理解JavaScript系列(7) S.O.L.I.D五大原则之开闭原则OCP
2012/01/15 Javascript
JS复制到剪贴板示例代码
2013/10/30 Javascript
JavaScript中的原型和继承详解(图文)
2014/07/18 Javascript
JavaScript判断字符长度、数字、Email、电话等常用判断函数分享
2015/04/01 Javascript
jQuery获取上传文件的名称的正则表达式
2015/05/21 Javascript
JavaScript多并发问题如何处理
2015/10/28 Javascript
AngularJS基础 ng-include 指令简单示例
2016/08/01 Javascript
jQuery实现根据生日计算年龄 星座 生肖
2016/11/23 Javascript
jquery实现图片上传前本地预览
2017/04/28 jQuery
JavaScript中 ES6变量的结构赋值
2018/07/10 Javascript
Vue学习之axios的使用方法实例分析
2020/01/06 Javascript
Python中int()函数的用法浅析
2017/10/17 Python
分享一下Python数据分析常用的8款工具
2018/04/29 Python
Python解析json时提示“string indices must be integers”问题解决方法
2019/07/31 Python
Python对象的属性访问过程详解
2020/03/05 Python
前端使用canvas生成盲水印的加密解密的实现
2020/12/16 HTML / CSS
香蕉共和国工厂店:Banana Republic Factory
2018/06/09 全球购物
华为智利官方商店:Huawei Chile
2020/05/09 全球购物
日语专业毕业生自荐信
2013/11/11 职场文书
小学安全汇报材料
2014/08/14 职场文书
好的促销活动方案
2014/08/21 职场文书
工作汇报开头与结尾怎么写
2014/11/08 职场文书
2014年圣诞节寄语
2014/12/08 职场文书
信访工作个人总结
2015/03/03 职场文书
药品销售员2015年终工作总结
2015/10/22 职场文书
2019年最新感恩节祝福语(28句)
2019/11/27 职场文书
python 中的@运算符使用
2021/05/26 Python
通过shell脚本对mysql的增删改查及my.cnf的配置
2021/07/07 MySQL
react 路由Link配置详解
2021/11/11 Javascript