当前位置:首页 > VUE

vue的数组实现原理

2026-02-24 11:03:12VUE

Vue 数组响应式原理

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

重写数组方法

Vue 会拦截以下数组方法:

  • push
  • pop
  • shift
  • unshift
  • splice
  • sort
  • reverse

这些方法被重写后,会在执行原有逻辑的同时触发依赖更新。

vue的数组实现原理

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

注意事项

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

vue的数组实现原理

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

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

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

深层数组监听

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

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

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

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

相关文章

vue rooter 实现原理

vue rooter 实现原理

Vue Router 实现原理 Vue Router 是 Vue.js 的官方路由管理器,其核心实现依赖于 Vue 的响应式系统和插件机制。以下是其核心原理的解析: 路由模式 Vue Route…

eventbus实现原理vue

eventbus实现原理vue

EventBus 实现原理 EventBus 在 Vue 中通常用于跨组件通信,其核心原理基于发布-订阅模式。通过一个中央事件总线,组件可以订阅事件或触发事件,实现非父子组件间的通信。 核心机制 E…

java如何创建数组

java如何创建数组

创建数组的基本方法 在Java中,数组是固定大小的同类型元素集合。创建数组需要声明数组类型并初始化。 声明数组 语法格式为 数据类型[] 数组名 或 数据类型 数组名[]: int[] arr1;…

java如何初始化数组

java如何初始化数组

初始化数组的方法 在Java中,数组可以通过多种方式进行初始化。以下是几种常见的方法: 静态初始化(直接赋值) 在声明数组时直接指定元素值,适用于已知数组内容的情况: int[] number…

vue数组怎么实现

vue数组怎么实现

Vue 数组操作方法 在 Vue 中操作数组时,需要遵循响应式原则,确保视图能正确更新。以下是常见的数组操作方法: 使用变异方法 Vue 对数组的变异方法进行了封装,这些方法会触发视图更新: pu…

Vue实现原理详解

Vue实现原理详解

Vue 实现原理核心解析 Vue.js 的核心实现基于响应式系统、虚拟 DOM 和组件化设计。以下是关键原理的分解: 响应式系统 通过 Object.defineProperty(Vue 2)或…