解决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 url传值中文乱码之解决之道
Nov 20 Javascript
利用webqq协议使用python登录qq发消息源码参考
Apr 08 Javascript
js控制表单操作的常用代码小结
Aug 15 Javascript
Jquery getJSON方法详细分析
Dec 26 Javascript
3种Jquery限制文本框只能输入数字字母的方法
Dec 03 Javascript
javascript实现图片轮播效果
Jan 20 Javascript
JS获取屏幕高度的简单实现代码
May 24 Javascript
js实现九宫格的随机颜色跳转
Feb 19 Javascript
webpack分离css单独打包的方法
Jun 12 Javascript
使用React手写一个对话框或模态框的方法示例
Apr 25 Javascript
Node.js实现用户评论社区功能(体验前后端开发的乐趣)
May 09 Javascript
用vue写一个日历
Nov 02 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 AJAX实例根据邮编自动完成地址信息
2008/11/23 PHP
ThinkPHP自定义函数解决模板标签加减运算的方法
2015/07/03 PHP
Zend Framework基本页面布局分析
2016/03/19 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
2017/12/21 PHP
javascript中style.left和offsetLeft的用法说明
2014/03/07 Javascript
jquery使用$(element).is()来判断获取的tagName
2014/08/24 Javascript
AngularJS 表达式详解及实例代码
2016/09/14 Javascript
AngularJs表单验证实例代码解析
2016/11/29 Javascript
EsLint入门学习教程
2017/02/17 Javascript
jQuery 判断元素整理汇总
2017/02/28 Javascript
Javascript实现base64的加密解密方法示例
2017/06/27 Javascript
Three.js开发实现3D地图的实践过程总结
2017/11/20 Javascript
vue-better-scroll 的使用实例代码详解
2018/12/03 Javascript
vuex(vue状态管理)的特殊应用案例分享
2020/03/03 Javascript
vue Cli 环境删除与重装教程 - 版本文档
2020/09/11 Javascript
Python使用os模块和fileinput模块来操作文件目录
2016/01/19 Python
python3中dict(字典)的使用方法示例
2017/03/22 Python
对python 各种删除文件失败的处理方式分享
2018/04/24 Python
Python XML转Json之XML2Dict的使用方法
2019/01/15 Python
Python查找不限层级Json数据中某个key或者value的路径方式
2020/02/27 Python
python 获取剪切板内容的两种方法
2020/11/28 Python
css3进行截取替代js的substring
2013/09/02 HTML / CSS
.TTL是什么?有什么用处,通常那些工具会用到它?(ping? traceroute? ifconfig? netstat?)
2016/05/09 面试题
三月学雷锋活动总结
2014/06/26 职场文书
求职意向书
2014/07/29 职场文书
领导班子自我剖析材料
2014/08/16 职场文书
2014年大学生党员评议表自我评价
2014/09/20 职场文书
工伤事故赔偿协议书(标准)
2014/09/29 职场文书
党委领导班子整改方案
2014/09/30 职场文书
医院护士党的群众路线教育实践活动对照检查材料思想汇报
2014/10/04 职场文书
2015元旦联欢晚会结束语
2014/12/14 职场文书
五一劳动节慰问信
2015/02/14 职场文书
小学教师师德师风自我评价
2015/03/04 职场文书
2016大学生优秀志愿者事迹材料
2016/02/25 职场文书
美国运营商 T-Mobile 以 117.83Mb/s 的速度排第一位
2022/04/21 数码科技
Windows Server 2012 R2 磁盘分区教程
2022/04/29 Servers