当前位置:首页 > VUE

vue 数组响应式实现

2026-01-22 04:48:41VUE

Vue 数组响应式实现原理

Vue 通过重写数组的原型方法来实现对数组操作的响应式监听。具体实现基于以下机制:

拦截数组变异方法

Vue 创建了一个继承自原生 Array 原型的对象,并重写了以下会改变原数组的方法:

  • push
  • pop
  • shift
  • unshift
  • splice
  • sort
  • reverse
const arrayProto = Array.prototype
const arrayMethods = Object.create(arrayProto)

const methodsToPatch = [
  'push',
  'pop',
  'shift',
  'unshift',
  'splice',
  'sort',
  'reverse'
]

methodsToPatch.forEach(function (method) {
  const original = arrayProto[method]
  def(arrayMethods, method, function mutator (...args) {
    const result = original.apply(this, args)
    const ob = this.__ob__
    let inserted
    switch (method) {
      case 'push':
      case 'unshift':
        inserted = args
        break
      case 'splice':
        inserted = args.slice(2)
        break
    }
    if (inserted) ob.observeArray(inserted)
    ob.dep.notify()
    return result
  })
})

依赖收集与通知

每个被观察的数组都有一个关联的 Observer 实例,其中包含一个 Dep 依赖收集器。当数组被修改时,会通过 dep.notify() 通知所有依赖的 Watcher 进行更新。

数组元素观测

对于数组中的对象元素,Vue 会递归地进行响应式处理:

Observer.prototype.observeArray = function observeArray (items) {
  for (let i = 0, l = items.length; i < l; i++) {
    observe(items[i])
  }
}

处理数组索引修改

直接通过索引修改数组元素或修改数组长度不会触发响应式更新:

// 不会触发响应式更新
vm.items[0] = newValue
vm.items.length = 0

对于这种情况,应该使用 Vue.set 或数组的 splice 方法:

vue 数组响应式实现

Vue.set(vm.items, 0, newValue)
vm.items.splice(0, 1, newValue)

实现细节

  1. 在初始化阶段,Vue 会检查数据是否为数组,如果是则修改其 proto 指向重写后的数组方法对象
  2. 对于新增的数组元素(如通过 push 添加的元素),会进行额外的响应式处理
  3. 数组的依赖收集与其他响应式数据使用相同的 Dep/Watcher 机制

这种实现方式既保持了 JavaScript 数组的原生性能,又实现了响应式更新,是 Vue 响应式系统的重要设计之一。

标签: 数组vue
分享给朋友:

相关文章

vue实现收起展开面板

vue实现收起展开面板

实现收起展开面板的方法 在Vue中实现收起展开面板功能可以通过多种方式完成,以下是几种常见的实现方法: 使用v-show或v-if控制显示隐藏 利用Vue的指令可以轻松实现面板的展开和收起:…

vue状态管理怎么实现

vue状态管理怎么实现

Vue 状态管理实现方法 使用 Vuex(官方推荐) Vuex 是 Vue 的官方状态管理库,适合中大型应用。 安装 Vuex: npm install vuex --save 创建 Store 示…

vue实现走势图

vue实现走势图

Vue 实现走势图的方法 使用 ECharts 库 ECharts 是一个强大的数据可视化库,支持多种图表类型,包括走势图(折线图)。在 Vue 项目中可以通过 vue-echarts 封装库或直接使…

vue实现全景

vue实现全景

Vue 实现全景效果的方法 使用 Vue 实现全景效果通常需要结合第三方库或框架,以下是几种常见的方法: 使用 Three.js 和 Vue-Three.js Three.js 是一个强大的 3D…

vue实现购票

vue实现购票

Vue 实现购票功能 数据结构设计 购票功能通常需要以下数据结构: 场次信息(时间、地点、价格) 座位信息(可选座位、已售座位) 用户订单信息 示例数据结构: data() { return…

vue实现tap

vue实现tap

Vue 实现 Tap 事件 在移动端开发中,Tap 事件比 Click 事件更常用,因为 Click 事件有 300ms 延迟。以下是几种在 Vue 中实现 Tap 事件的方法。 使用第三方库 安装…