一、数组

1.  不能监听的情况

(1) 直接通过下标赋值  arr[i] = value

(2) 直接修改数组长度 arr.length = newLen

2.  替代做法

(1)修改值

1. Vue.set(arr, index, newvalue)
2. vm.$set(arr, index, newvalue)
3. arr.splice(index, 1, newvalue)

(2) 修改数组长度,

arr.splice(newLen)

3. 注意

调用数组的pop、push、shift、unshift、splice、sort、reverse等方法时是可以监听到数组的变化的

vue内部相当于重写了数组的原型,劫持了这七个方法

二、对象

1. 不能监听的情况

属性的新增和删除

obj.newkey=newvalue

delete obj.key

2. 替代做法

// 新增
1. Vue.set(obj, newkey, newvalue)
2. vm.$set(obj, newkey, newvalue)
3. obj = Object.assign({}, obj, {newkey1: newvalue1, newkey2: newvalue2})
// 删除
1. Vue.delete(obj, key)
2. vm.$delete(obj, key)

三、分析 vue 2 无法监听数组和对象的这些变化的原因

首先,vue2是通过Object.defineProperty(obj, key, value)这种方式监听数据的

1. 对于数组

Object.defineProperty()是可以对数组实现监听操作的,但是vue并没有实现这个功能,因为数组长度不定而且数据可能会很多,如果对每一个数据都实现监听,性能代价太大

但是注意:数组中的元素是引用类型时是会被监听的

2. 对象

Object.defineProperty()针对的是对象的某个属性,而且这个操作在vue的初始化阶段就完成了,所以新增的属性无法监听,通过set方法新增对象就相当于初始化阶段的数据响应式处理

四、 vue 3响应式原理

vue 3是通过proxy直接代理整个对象来实现的,而不是像Object.defineProperty针对某个属性。所以,只需做一层代理就可以监听同级结构下的所有属性变化,包括新增属性和删除属性

参考链接:

1. https://blog.csdn.net/kkkkk0826/article/details/102680084

2. https://cn.vuejs.org/v2/guide/reactivity.html

3. https://www.cnblogs.com/youhong/p/12173354.html

VUE 2 无法监听数组和对象的某些变化相关推荐

  1. vue 监听map数组变化_解决vue无法侦听数组及对象属性的变化问题

    一.数组 1.可以监听到的情况 如push.splice.=赋值(array=[1,2,3]) 2.无法监听到的情况 使用下标修改某个元素(这种比较常见) array[index] = 1 objec ...

  2. [vue] 分别说说vue能监听到数组或对象变化的场景,还有哪些场景是监听不到的?无法监听时有什么解决方案?

    [vue] 分别说说vue能监听到数组或对象变化的场景,还有哪些场景是监听不到的?无法监听时有什么解决方案? 无法监听时的方案: 数组:改变数组的值:this.$set() 改变数组长度:arr.sp ...

  3. watch深度监听数组_vue watch普通监听和深度监听实例详解(数组和对象)

    vue watch普通监听和深度监听实例详解(数组和对象) 下面通过一段代码给大家介绍vue watch的普通监听和深度监听,具体代码如下所示: var vm=new Vue({ data:{ num ...

  4. vue用watch监听对象,打印oldValue和newValue相同的问题

    vue用watch监听对象,打印oldValue和newValue相同的问题 背景 做节目设计器时候,当组件超出限制大小时,需要回滚此次操作,但是数据没有备份,拿不到旧数据.因此在watch中监听变化 ...

  5. web前端面试高频考点——Vue原理(理解MVVM模型、深度/监听data变化、监听数组变化、深入了解虚拟DOM)

    系列文章目录 内容 参考链接 Vue基本使用 Vue的基本使用(一文掌握Vue最基础的知识点) Vue通信和高级特性 Vue组件间的通信及高级特性(多种组件间的通信.自定义v-model.nextTi ...

  6. vue watch第一次监听不到_Vue 的 computed 和 watch 的区别

    computer 计算属性 通过计算得出的属性就是计算属性 计算属性可以是一个函数或者是一个getter和setter组成的对象 看看一个展示名字的实例: 需求一:展示名字 // 引用完整版 Vue, ...

  7. vue,watch监听数据,数据监听

    vue,watch监听数据,数据监听 三个值: 1.第一个handler:其值是一个回调函数.即监听到变化时应该执行的函数. 2.第二个是deep:其值是true或false:确认是否深入监听.(一般 ...

  8. Object.defineProperty也能监听数组变化?

    本文简介 点赞 + 关注 + 收藏 = 学会了 首先,解答一下标题:Object.defineProperty 不能监听原生数组的变化.如需监听数组,要将数组转成对象. 在 Vue2 时是使用了 Ob ...

  9. vue/xx/事件监听,按键与键码值

    vue中的事件监听 <!DOCTYPE html> <html lang="en"><head><meta charset="U ...

最新文章

  1. python代码该怎么简化_如何简化这个python代码(从书中分配)?
  2. 可爱的MicrosoftAjax.js精简版(47K)
  3. TypeScript VS JavaScript 深度对比
  4. 一个不错的git学习网站
  5. Redhat7 systemctl命令
  6. 怎么测并发 PHP,PHP接口并发测试的方法(推荐)
  7. idea14创建java项目_使用IntelliJ IDEA 14和Maven创建java web项目
  8. 分清DB_NAME、INSTANCE_NAME、ORACLE_SID、SERVICE_NAME、DB_DOMAIN和GLOBAL_DB_NAME
  9. 四川方言说唱《管我锤子事》
  10. Qt官网变更【2012】
  11. 【转】WCF、Net remoting、Web service概念及区别
  12. python xlutils教程_python xlutils复制表格使用方法
  13. LeetCode : Intersection of Two Linked Lists
  14. 剑指Offer_42_和为S的两个数字
  15. ftp一句話download
  16. 【路径规划】基于matlab粒子群优化蚁群算法最短路径规划【含Matlab源码 076期】
  17. 如何在linux系统开发gd32,对于GD32VF103一些想法
  18. 京东优惠价格策略助手
  19. excel验证身份证号码是否正确
  20. Qt5.12.9 搜狗输入法不能使用,配置解决方案

热门文章

  1. 这样的家居选购界面让你忍不住剁手的冲动!
  2. 秋季唯美海报,打造的一系列秋季主题视觉
  3. word文档服务器多人打开后就损坏,打开word文档损坏
  4. java学习笔记_2020全网最全Java面试题,学习笔记!
  5. js webpack 解决跨域问题_详解webpack-dev-server使用http-proxy解决跨域问题
  6. vue 将字符串最后一个字符给替换_初尝VUE
  7. java qrious 二维码中文无反应_来了来了,今天的苹果限免应用刚刚出炉,8款APP在App Store限时免费啦!手慢无~...
  8. 三菱fx5u modbus tcp fb块用法_三菱PLC型号怎么选?四大方面告诉你三菱FX3U和5U的最大区别!...
  9. centos内核错误_centos 升级内核失败回救
  10. python中的然后_返回,然后等待另一个函数在python中完成