当前位置:首页 > VUE

vue数组实现原理

2026-02-09 12:34:24VUE

Vue 数组响应式原理

Vue 通过重写数组的变异方法(如 pushpopshiftunshiftsplicesortreverse)来实现对数组变化的监听。这些方法被修改后,会在执行原有逻辑的同时触发视图更新。

核心实现机制

Vue 使用 Object.defineProperty 对数组的变异方法进行拦截。具体步骤如下:

  1. 创建拦截器对象
    定义一个对象,包含与原生数组方法同名的方法,但在执行时会额外触发依赖通知。

    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__
        ob.dep.notify()
        return result
      })
    })
  2. 覆盖目标数组的原型
    当 Vue 初始化数据时,如果遇到数组,会将数组的原型指向自定义的拦截器对象。

    if (Array.isArray(value)) {
      const augment = hasProto
        ? protoAugment
        : copyAugment
      augment(value, arrayMethods, arrayKeys)
      this.observeArray(value)
    }
  3. 处理新增元素
    对于 pushunshiftsplice 等方法新增的元素,Vue 会遍历这些新元素并将其转换为响应式数据。

    vue数组实现原理

    if (inserted) ob.observeArray(inserted)

无法检测的情况

由于 JavaScript 的限制,Vue 无法检测以下数组变动:

  • 直接通过索引设置项(如 arr[0] = newValue
  • 修改数组长度(如 arr.length = 0

解决方法:

  • 使用 Vue.setvm.$set
    Vue.set(arr, index, newValue)
  • 使用 splice
    arr.splice(index, 1, newValue)

源码关键点

在 Vue 2.x 源码中,数组响应式处理主要在 src/core/observer/index.jssrc/core/observer/array.js 文件中实现。核心是通过拦截数组方法并触发依赖更新,同时对新元素进行响应式处理。

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

相关文章

vue实现原理

vue实现原理

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

java如何输出数组

java如何输出数组

输出数组的方法 在Java中,输出数组内容有多种方式,具体取决于数组类型和输出格式需求。以下是几种常见的方法: 使用Arrays.toString()方法 适用于一维数组,直接调用Arrays.to…

js实现原理

js实现原理

JavaScript 实现原理 JavaScript 是一种解释型语言,其实现原理涉及多个核心组件和运行机制,包括引擎、运行时环境、事件循环等。 引擎与解释执行 现代 JavaScript 引擎(如…

vue技术实现原理

vue技术实现原理

Vue 技术实现原理 Vue.js 是一个渐进式 JavaScript 框架,其核心实现原理主要包括响应式系统、虚拟 DOM、模板编译和组件化机制。 响应式系统 Vue 的响应式系统基于 Objec…

理解vue实现原理

理解vue实现原理

Vue 实现原理的核心机制 Vue.js 的核心实现基于响应式系统、虚拟 DOM 和组件化设计。通过数据劫持结合发布-订阅模式实现数据驱动视图的更新。 响应式系统 Vue 使用 Object.def…

vue双向实现原理

vue双向实现原理

Vue 双向数据绑定的实现原理 Vue 的双向数据绑定主要通过数据劫持结合发布-订阅模式实现,核心是 Object.defineProperty(Vue 2.x)或 Proxy(Vue 3.x)。…