当前位置:首页 > VUE

vue数组实现原理

2026-02-25 17:50:06VUE

Vue 数组响应式实现原理

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

核心实现步骤

拦截数组原型方法 Vue 创建了一个继承自 Array.prototype 的新对象 arrayMethods,并重写了其中的变异方法。当调用这些方法时,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数组实现原理

注意事项

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

性能优化

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

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

相关文章

js轮播图实现原理

js轮播图实现原理

轮播图的基本原理 轮播图通过动态切换显示的内容(图片、文本等)实现视觉上的滑动效果。核心原理是利用CSS和JavaScript控制元素的显示与隐藏,或通过变换位置实现滑动动画。 实现方法一:CSS…

js放大镜的实现原理

js放大镜的实现原理

放大镜效果的基本原理 放大镜效果的核心是通过鼠标移动事件获取当前光标位置,动态计算放大区域的显示范围和比例。通常需要两个元素:原图容器和放大镜显示的容器。当鼠标在原图上移动时,放大镜容器显示对应位置的…

jquery数组

jquery数组

jQuery 数组操作 jQuery 提供了多种方法来操作数组或类数组对象(如 jQuery 对象集合)。以下是常见的数组操作方法: 遍历数组 使用 $.each() 方法可以遍历数组或对象: v…

vue如何实现原理

vue如何实现原理

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

java如何输入数组

java如何输入数组

输入数组的方法 在Java中,可以通过多种方式输入数组,具体取决于输入源(如控制台、文件等)和数组类型(如基本类型或对象类型)。以下是几种常见的方法: 使用Scanner从控制台输入 对于基本数据类…

js实现原理

js实现原理

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