解决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获取距今n天前的日期
Jul 08 Javascript
JS清除选择内容的方法
Jan 29 Javascript
基于bootstrap3和jquery的分页插件
Jul 31 Javascript
JS与jQ读取xml文件的方法
Dec 08 Javascript
AngularJS使用ng-Cloak阻止初始化闪烁问题的方法
Nov 03 Javascript
BootStrap表单验证实例代码
Jan 13 Javascript
利用js定义一个导航条菜单
Mar 14 Javascript
基于jquery日历价格、库存等设置插件
Jul 05 jQuery
微信小程序模版渲染详解
Jan 26 Javascript
浏览器事件循环与vue nextTicket的实现
Apr 16 Javascript
js prototype深入理解及应用实例分析
Nov 25 Javascript
详解Vue3使用axios的配置教程
Apr 29 Vue.js
使用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
一次编写,随处运行
2006/10/09 PHP
我的论坛源代码(九)
2006/10/09 PHP
simplehtmldom Doc api帮助文档
2012/03/26 PHP
在Win7 中为php扩展配置Xcache
2014/10/08 PHP
dedecms中使用php语句指南
2014/11/13 PHP
实现WordPress主题侧边栏切换功能的PHP脚本详解
2015/12/14 PHP
Laravel框架基础语法与知识点整理【模板变量、输出、include引入子视图等】
2019/12/03 PHP
jQuery 1.0.4 - New Wave Javascript(js源文件)
2007/01/15 Javascript
Dojo 学习笔记入门篇 First Dojo Example
2009/11/15 Javascript
Json2Template.js 基于jquery的插件 绑定JavaScript对象到Html模板中
2011/10/29 Javascript
浅谈JavaScript Math和Number对象
2015/01/26 Javascript
原生js实现旋转木马轮播图效果
2017/02/27 Javascript
详解VueJs异步动态加载块
2017/03/09 Javascript
使用Javascript简单计算器
2018/11/17 Javascript
对layui中的onevent 和event的使用详解
2019/09/06 Javascript
vue router 传参获取不到的解决方式
2019/11/13 Javascript
Node.js中文件系统fs模块的使用及常用接口
2020/03/06 Javascript
vue页面引入three.js实现3d动画场景操作
2020/08/10 Javascript
[04:03]DOTA2肉山黑名单梦之声 风暴之灵中文配音鉴赏
2013/07/03 DOTA
Python实现简单多线程任务队列
2016/02/27 Python
基于python select.select模块通信的实例讲解
2017/09/21 Python
Python 读取某个目录下所有的文件实例
2018/06/23 Python
Python tcp传输代码实例解析
2020/03/18 Python
Keras设置以及获取权重的实现
2020/06/19 Python
Notino罗马尼亚网站:购买香水和化妆品
2019/07/20 全球购物
公务员政审个人鉴定
2014/02/25 职场文书
《赶海》教学反思
2014/04/20 职场文书
财务管理专业求职信
2014/06/11 职场文书
设计大赛策划方案
2014/06/13 职场文书
超市员工辞职信范文
2015/05/12 职场文书
《圆明园的毁灭》教学反思
2016/02/16 职场文书
一些让Python代码简洁的实用技巧总结
2021/08/23 Python
MongoDB连接数据库并创建数据等使用方法
2021/11/27 MongoDB
Matplotlib绘制条形图的方法你知道吗
2022/03/21 Python
Nginx HTTP跳转至HTTPS
2022/05/15 Servers
git stash(储藏)的用法总结
2022/06/25 Servers