在vue2中监听数组响应式不会触发情况

在vue2的项目中,有时会遇到修改数组的参数时,不会触发响应式变化,还需要单独来触发,实现响应式监听,这次就来探究一下为什么数组在v2中有时不会触发响应式。

不会触发响应式情况

官方文档中已经说明不会触发响应式更新的案例。

有两种情况不会触发数组的响应式更新:

  • 通过下标索引来直接设置和修改数组
  • 修改数组的长度length树形
js 复制代码
  data() {
    return {
      testArr:['1' , '2'],
    }
  },
  不会触发响应式变化情况
  this.testArr[1] = '3'  // 不会触发响应式变化
  this.testArr.length = 1  // 不会触发响应式变化

解决办法

  • 使用$set的方法手动添加监听
  • 可以使用数组本身的方法也可以实现监听(push,unshift,pop,splice...)
js 复制代码
this.$set(this.testArr, 1, "我被修改了");   // 可以在方法中手动添加改变,触发监听
this.testArr.splice(1, 1, "我被修改了")

原因


由于 JavaScript 的限制,Vue 不能检测数组和对象的变化。


我们知道vue2的双向绑定使用的是object.defineProperty(),经过测试,object.defineProperty()是可以监听到数组下标的变化

js 复制代码
let arr = [1,2,3,4]
Object.defineProperty(arr,1,{
  get:function() {
    console.log('调用了');
  },
  set:function(newVal) {
    console.log('修改了',newVal);
  },
  
})
arr[1] = 5;     // 根据下标修改时,触发了set函数,可以被监听到
  • 所以object.defineProperty()是可以监听到数组的下标变化,vue2因为性能问题放弃了这个属性

  • 在vue3中,使用的proxy实现的双向绑定,所以当使用vue3对数组的下标进行修改时,还会触发响应式
相关推荐
Java小卷29 分钟前
流程设计器为啥选择diagram-js
前端·低代码·工作流引擎
HelloReader1 小时前
Isolation Pattern(隔离模式)在前端与 Core 之间加一道“加密网关”,拦截与校验所有 IPC
前端
兆子龙2 小时前
从 float 到 Flex/Grid:CSS 左右布局简史与「刁钻」布局怎么搞
前端·架构
YukiMori232 小时前
一个有趣的原型继承实验:为什么“男人也会生孩子”?从对象赋值到构造函数继承的完整推演
前端·javascript
_哆啦A梦2 小时前
Vibe Coding 全栈专业名词清单|设计模式·基础篇(创建型+结构型核心名词)
前端·设计模式·vibecoding
百里静修2 小时前
一个 Hook 拦截所有 AJAX 请求:ajax-hooker 使用指南与原理
前端
摸鱼的春哥2 小时前
惊!黑客靠AI把墨西哥政府打穿了,海量数据被黑
前端·javascript·后端
小兵张健2 小时前
Playwright MCP 截图标注方案调研(推荐方案1)
前端·javascript·github
小兵张健3 小时前
AI 页面与交互迁移流程参考
前端·ai编程·mcp
小兵张健4 小时前
掘金发布 SOP(Codex + Playwright MCP + Edge)
前端·mcp