解决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 相关文章推荐
Javascript在IE或Firefox下获取鼠标位置的代码
Dec 18 Javascript
精选的10款用于构建良好易用性网站的jQuery插件
Jan 23 Javascript
JavaScript中判断函数是new还是()调用的区别说明
Apr 07 Javascript
jquery和ajax的关系详细介绍
Nov 29 Javascript
jQuery 回调函数(callback)的使用和基础
Feb 26 Javascript
JavaScript动态改变表格单元格内容的方法
Mar 30 Javascript
JavaScript中的事件委托及好处
Jul 12 Javascript
Vue+axios+WebApi+NPOI导出Excel文件实例方法
Jun 05 Javascript
如何通过shell脚本自动生成vue文件详解
Sep 10 Javascript
JS运算符简单用法示例
Jan 19 Javascript
JavaScript 实现下雪特效的示例代码
Sep 09 Javascript
解决vue props传Array/Object类型值,子组件报错的情况
Nov 07 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中自定义函数dump查看数组信息类似var_dump
2014/01/27 PHP
PHP检测移动设备类mobile detection使用实例
2014/04/14 PHP
php使用指定编码导出mysql数据到csv文件的方法
2015/03/31 PHP
PHP面试常用算法(推荐)
2016/07/22 PHP
学习ExtJS border布局
2009/10/08 Javascript
使用SyntaxHighlighter实现HTML高亮显示代码的方法
2010/02/04 Javascript
Extjs中常用表单介绍与应用
2010/06/07 Javascript
jquery.boxy插件的iframe扩展代码
2010/07/02 Javascript
filters.revealTrans.Transition使用方法小结
2010/08/19 Javascript
基于mootools 1.3框架下的图片滑动效果代码
2011/04/22 Javascript
JS图片无缝滚动(简单利于使用)
2013/06/17 Javascript
js onclick事件传参讲解
2013/11/06 Javascript
AngularJS实现元素显示和隐藏的几个案例
2015/12/09 Javascript
jquery实现ajax提交表单信息的简单方法(推荐)
2016/08/24 Javascript
javascript宿主对象之window.navigator详解
2016/09/07 Javascript
Bootstrap Table使用方法解析
2016/10/19 Javascript
通过AngularJS实现图片上传及缩略图展示示例
2017/01/03 Javascript
js登录滑动验证的实现(不滑动无法登陆)
2018/01/03 Javascript
JavaScript使用math.js进行精确计算操作示例
2018/06/19 Javascript
jQuery实现轮播图效果demo
2020/01/11 jQuery
vue路由跳转传递参数的方式总结
2020/05/10 Javascript
jquery html添加元素/删除元素操作实例详解
2020/05/20 jQuery
js实现拾色器插件(ColorPicker)
2020/05/21 Javascript
three.js 如何制作魔方
2020/07/31 Javascript
JavaScript实现与web通信的方法详解
2020/08/07 Javascript
python使用xmlrpc实例讲解
2013/12/17 Python
浅谈Python数据类型判断及列表脚本操作
2016/11/04 Python
python 3利用BeautifulSoup抓取div标签的方法示例
2017/05/28 Python
Pandas 数据框增、删、改、查、去重、抽样基本操作方法
2018/04/12 Python
python如何实现复制目录到指定目录
2020/02/13 Python
python七种方法判断字符串是否包含子串
2020/08/18 Python
详解HTML5中表单验证的8种方法介绍
2016/12/19 HTML / CSS
护士求职自荐信范文
2014/03/19 职场文书
2015年客服工作总结范文
2015/04/02 职场文书
证劵公司反洗钱宣传活动总结
2015/05/08 职场文书
演讲稿之感恩老师(三篇范文)
2019/09/06 职场文书