当前位置:首页 > VUE

vue数组实现原理

2026-02-25 17:50:06VUE

Vue 数组响应式实现原理

Vue 通过重写数组的原型方法来实现对数组变化的监听。具体实现方式是通过拦截数组的变异方法(如 pushpopshiftunshiftsplicesortreverse),并在这些方法被调用时触发视图更新。

vue数组实现原理

核心实现步骤

拦截数组原型方法 Vue 创建了一个继承自 Array.prototype 的新对象 arrayMethods,并重写了其中的变异方法。当调用这些方法时,Vue 会先执行原始方法,再通知依赖更新。

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 在初始化数据时,会检查数据是否为数组。如果是数组,则将数组的原型指向 arrayMethods,从而实现对数组方法的拦截。

if (Array.isArray(value)) {
  const augment = hasProto
    ? protoAugment
    : copyAugment
  augment(value, arrayMethods, arrayKeys)
  this.observeArray(value)
}

处理新增元素 对于 pushunshiftsplice 这些可能新增元素的方法,Vue 会对新增的元素进行响应式处理,确保新元素也是响应式的。

注意事项

  • Vue 无法检测通过索引直接设置数组项的变化(如 arr[0] = newValue),应使用 Vue.setarr.splice 替代。
  • Vue 也无法检测直接修改数组长度的变化(如 arr.length = 0),应使用 arr.splice(0) 替代。

性能优化

Vue 通过重写数组方法而非使用 Object.defineProperty 监听数组每一项,主要是出于性能考虑。数组可能包含大量元素,逐项监听会带来较大性能开销。

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

相关文章

vue rooter 实现原理

vue rooter 实现原理

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

react如何创建数组

react如何创建数组

创建数组的方法 在React中创建数组与普通JavaScript相同,可以使用多种方式。以下是常见的几种方法: 使用数组字面量 const array = [1, 2, 3, 4]; 使用Arra…

java如何定义字符串数组

java如何定义字符串数组

定义字符串数组的方法 在Java中定义字符串数组有多种方式,具体取决于使用场景和初始化需求。以下是常见的几种方法: 直接初始化数组元素 String[] strArray = {"Appl…

java如何定义一个数组

java如何定义一个数组

定义数组的基本语法 在Java中,数组是固定长度的同类型数据集合。定义数组需要指定数据类型和数组名称,并可以选择直接初始化或稍后分配空间。 // 声明数组但不初始化 数据类型[] 数组名; //…

java如何遍历数组

java如何遍历数组

遍历数组的方法 Java中遍历数组有多种方式,以下是常见的几种方法: 使用for循环 通过索引逐个访问数组元素: int[] array = {1, 2, 3, 4, 5}; for (int i…

vue 实现数组排序

vue 实现数组排序

在 Vue 中实现数组排序的方法 使用 JavaScript 原生排序方法 Vue 中可以直接调用 JavaScript 的 Array.prototype.sort() 方法对数组进行排序。对于数字…