解决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 相关文章推荐
Jquery实战_读书笔记2 选择器
Jan 22 Javascript
javascript各浏览器中option元素的表现差异
Apr 07 Javascript
从QQ网站中提取的纯JS省市区三级联动菜单
Dec 25 Javascript
jQuery对象的length属性用法实例
Dec 27 Javascript
Vue异步组件使用详解
Apr 08 Javascript
基于JavaScript实现带数据验证和复选框的表单提交
Aug 23 Javascript
基于rollup的组件库打包体积优化小结
Jun 18 Javascript
Vue项目中最新用到的一些实用小技巧
Nov 06 Javascript
jQuery实现动态添加和删除input框代码实例
Mar 29 jQuery
vue请求服务器数据后绑定不上的解决方法
Oct 30 Javascript
TypeScript 引用资源文件后提示找不到的异常处理技巧
Jul 15 Javascript
VUE和Antv G6实现在线拓扑图编辑操作
Oct 28 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
连接到txt文本的超链接,不直接打开而是点击后下载的处理方法
2009/07/01 PHP
PHP连接SQLServer2005的实现方法(附ntwdblib.dll下载)
2012/07/02 PHP
php生成略缩图代码
2012/07/16 PHP
wampserver改变默认网站目录的办法
2015/08/05 PHP
dvwa+xampp搭建显示乱码的问题及解决方案
2015/08/23 PHP
日常整理PHP中简单的图形处理(经典)
2015/10/26 PHP
PHP打印输出函数汇总
2016/08/28 PHP
php版微信自动登录并获取昵称的方法
2016/09/23 PHP
php图像处理函数imagecopyresampled用法详解
2016/12/02 PHP
浅谈php://filter的妙用
2019/03/05 PHP
获取select元素被选中的文本内容的js代码
2014/01/29 Javascript
用js的document.write输出的广告无阻塞加载的方法
2014/06/05 Javascript
VUE中使用Vue-resource完成交互
2017/07/21 Javascript
详解React中合并单元格的正确写法
2019/01/08 Javascript
微信小程序实现bindtap等事件传参
2019/04/08 Javascript
python通过pil模块将raw图片转换成png图片的方法
2015/03/16 Python
Python 数据结构之堆栈实例代码
2017/01/22 Python
python基本语法练习实例
2017/09/19 Python
python多进程实现进程间通信实例
2017/11/24 Python
在Mac上删除自己安装的Python方法
2018/10/29 Python
使用pytorch和torchtext进行文本分类的实例
2020/01/08 Python
pytorch GAN伪造手写体mnist数据集方式
2020/01/10 Python
Python多线程正确用法实例解析
2020/05/30 Python
python3 中时间戳、时间、日期的转换和加减操作
2020/07/14 Python
Python3+Flask安装使用教程详解
2021/02/16 Python
浅谈HTML5 & CSS3的新交互特性
2016/07/19 HTML / CSS
德国网上药房:Apotal
2017/04/04 全球购物
物业管理个人自我评价
2013/11/08 职场文书
DIY蛋糕店的创业计划书范文
2013/12/26 职场文书
爱耳日活动总结
2014/04/30 职场文书
2014年最新领导班子整改方案
2014/09/27 职场文书
2014年煤矿工作总结
2014/11/24 职场文书
财政局长个人总结
2015/03/04 职场文书
试用期转正工作总结2015
2015/05/28 职场文书
卖车协议书范文
2016/03/23 职场文书
详解PHP设计模式之依赖注入模式
2021/05/25 PHP