当前位置:首页 > VUE

vue的数组实现原理

2026-02-24 11:03:12VUE

Vue 数组响应式原理

Vue 通过重写数组的原型方法来实现对数组变化的监听。具体实现方式是利用 JavaScript 的原型链机制,创建一个新的数组原型对象,并覆盖其中能够修改原数组的方法。

重写数组方法

Vue 会拦截以下数组方法:

  • 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
  })
})

数组响应式处理

Vue 在处理数据响应式时,会对数组进行特殊处理:

class Observer {
  constructor(value) {
    if (Array.isArray(value)) {
      value.__proto__ = arrayMethods
      this.observeArray(value)
    } else {
      this.walk(value)
    }
  }

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

注意事项

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

// 不会触发视图更新
this.items[index] = newValue
this.items.length = newLength

应该使用 Vue 提供的 set 方法或数组的变异方法:

// 正确方式
this.$set(this.items, index, newValue)
this.items.splice(index, 1, newValue)

深层数组监听

对于嵌套数组,Vue 会递归地为每个数组元素创建响应式绑定:

vue的数组实现原理

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

这种实现方式确保了数组操作能够触发视图更新,同时保持了 JavaScript 数组原有的行为特性。

标签: 数组原理
分享给朋友:

相关文章

vue的原理实现

vue的原理实现

Vue 的核心原理实现 Vue.js 的核心原理主要包括响应式系统、虚拟 DOM、模板编译和组件化机制。以下是关键实现细节: 响应式系统 Vue 2.x 使用 Object.defineProper…

vue实现原理比较

vue实现原理比较

Vue 2 实现原理 Vue 2 的核心实现基于响应式系统和虚拟 DOM。响应式系统通过 Object.defineProperty 对数据进行劫持,当数据变化时触发依赖更新。虚拟 DOM 则通过 d…

vue 监听实现原理

vue 监听实现原理

Vue 监听实现原理 Vue 的监听机制主要通过 Object.defineProperty 或 Proxy 实现数据劫持,结合观察者模式(Observer-Watcher-Dep)完成依赖收集和派发…

vue组件实现原理

vue组件实现原理

Vue 组件实现原理 Vue 组件的核心实现基于以下机制: 组件注册与模板解析 Vue 组件通过 Vue.component() 或单文件组件(.vue 文件)注册。模板会被编译成渲染函数,最终生成…

vue监听实现原理

vue监听实现原理

Vue 监听实现原理 Vue 的监听机制主要依赖于响应式系统和依赖收集,通过 Object.defineProperty 或 Proxy 实现数据劫持,并在数据变化时触发更新。 核心概念:响应式系统…

vue store实现原理

vue store实现原理

Vuex 的实现原理 Vuex 是 Vue.js 的状态管理库,其核心原理围绕状态集中管理、响应式数据绑定和单向数据流设计。以下是关键实现机制: 核心概念与实现 State Vuex 的状态存储基…