解决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控制web打印(局部打印)方法整理
May 29 Javascript
jQuery+ajax实现滚动到页面底部自动加载图文列表效果(类似图片懒加载)
Jun 07 Javascript
AngularJS入门教程之服务(Service)
Jul 27 Javascript
利用jQuery对无序列表排序的简单方法
Oct 16 Javascript
jQuery实现动态添加、删除按钮及input输入框的方法
Apr 27 jQuery
vue.js中created方法作用
Mar 30 Javascript
详解vue.js根据不同环境(正式、测试)打包到不同目录
Jul 13 Javascript
vue鼠标悬停事件实例详解
Apr 01 Javascript
vue2配置scss的方法步骤
Jun 06 Javascript
js实现纯前端压缩图片
Nov 16 Javascript
jQuery实现影院选座订座效果
Apr 13 jQuery
Python机器学习之决策树和随机森林
Jul 15 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
星际争霸 Starcraft 发展史
2020/03/14 星际争霸
解析PHP的session过期设置
2013/06/29 PHP
PHP中将ip地址转成十进制数的两种实用方法
2013/08/15 PHP
学习php设计模式 php实现享元模式(flyweight)
2015/12/07 PHP
postfixadmin忘记密码后的修改密码方法详解
2016/07/20 PHP
php判断str字符串是否是xml格式数据的方法示例
2017/07/26 PHP
PHP常用的类封装小结【4个工具类】
2019/06/28 PHP
JavaScript 匿名函数(anonymous function)与闭包(closure)
2011/10/04 Javascript
extJS中常用的4种Ajax异步提交方式
2014/03/07 Javascript
javascript获取元素偏移量的方法有哪些
2014/06/24 Javascript
jquery uploadify 在FF下无效的解决办法
2014/09/26 Javascript
原生JS实现响应式瀑布流布局
2015/04/02 Javascript
JavaScript 表单处理实现代码
2015/04/13 Javascript
快速掌握Node.js事件驱动模型
2016/03/21 Javascript
jQuery 更改checkbox的状态,无效的解决方法
2016/07/22 Javascript
AngularJS入门教程之REST和定制服务详解
2016/08/19 Javascript
全面解析Bootstrap表单样式的使用
2016/09/09 Javascript
让DIV的滚动条自动滚动到最底部的3种方法(推荐)
2016/09/24 Javascript
AngularJS入门教程之与服务器(Ajax)交互操作示例【附完整demo源码下载】
2016/11/02 Javascript
Node.js成为Web应用开发最佳选择的原因
2018/02/05 Javascript
解决vue热替换失效的根本原因
2018/09/19 Javascript
javascript的this关键字详解
2019/05/20 Javascript
解决Vue中 父子传值 数据丢失问题
2019/08/27 Javascript
[05:08]DOTA2-DPC中国联赛3月6日Recap集锦
2021/03/11 DOTA
python 设置xlabel,ylabel 坐标轴字体大小,字体类型
2019/07/23 Python
Python pandas库中的isnull()详解
2019/12/26 Python
Python中join()函数多种操作代码实例
2020/01/13 Python
python打印文件的前几行或最后几行教程
2020/02/13 Python
python如何代码集体右移
2020/07/20 Python
时尚的CSS3进度条效果
2012/02/22 HTML / CSS
美国百年历史早餐食品供应商:Wolferman’s
2017/01/18 全球购物
Visual-Click葡萄牙:欧洲领先的在线眼镜商
2020/02/17 全球购物
《月球之谜》教学反思
2014/04/10 职场文书
勇敢的心观后感
2015/06/09 职场文书
追悼词范文大全
2015/06/23 职场文书
如何有效防止sql注入的方法
2021/05/25 SQL Server