当前位置:首页 > VUE

vue数组实现原理

2026-01-11 23:48:38VUE

Vue 数组响应式原理

Vue 通过重写数组的原型方法来实现对数组变化的监听。Vue 没有直接监听数组的索引变化,而是通过拦截数组的变异方法(如 pushpopsplice 等)来触发视图更新。

实现机制

Vue 创建了一个继承自 Array.prototype 的新对象,并重写了其中的变异方法。当调用这些方法时,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
  })
})

数组响应式处理流程

  1. 初始化阶段
    Vue 在初始化数据时,会遍历数组的每个元素,对非原始值进行响应式处理。

  2. 方法拦截
    当调用数组的变异方法时,Vue 会先执行原始操作,然后对新插入的元素进行响应式处理,最后通知依赖更新。

  3. 依赖收集
    数组的依赖收集通过 __ob__ 属性完成,每个响应式数组都会有一个关联的 Observer 实例。

注意事项

  • 直接通过索引修改数组元素(如 arr[0] = newValue)不会触发视图更新,需使用 Vue.setthis.$set
  • 修改数组长度(如 arr.length = 0)同样不会触发更新。
  • 对于非变异方法(如 concatslice),Vue 不会拦截,但返回的新数组如果是响应式的,其元素会被处理。

替代方案

对于需要深度监听或复杂数组操作的情况,可以使用以下方式:

vue数组实现原理

  • 使用 Vue.setthis.$set 修改数组元素
  • 使用 splice 方法替代直接赋值
  • 对于大规模数据更新,考虑使用 this.$forceUpdate()(不推荐频繁使用)

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

相关文章

react如何创建数组

react如何创建数组

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

简述vue实现原理

简述vue实现原理

Vue 实现原理概述 Vue 的核心实现原理基于数据劫持、虚拟 DOM 和模板编译等技术,通过响应式系统实现数据和视图的自动同步。 响应式系统 Vue 使用 Object.definePropert…

vue bus实现原理

vue bus实现原理

Vue 事件总线(Bus)实现原理 Vue 事件总线(Bus)是一种跨组件通信的机制,通常用于非父子组件之间的数据传递。其核心原理基于 Vue 实例的事件系统。 核心机制 Vue 事件总线通过创建一…

vue 路由实现原理

vue 路由实现原理

Vue 路由实现原理 Vue Router 是 Vue.js 官方的路由管理器,其核心原理基于前端路由的实现方式。以下是 Vue Router 的主要实现机制: 路由模式 Vue Router 支持…

vue实现原理书籍

vue实现原理书籍

以下是关于Vue实现原理的推荐书籍和学习资源,涵盖核心机制、源码解析及实践应用: 深入理解Vue核心机制 《Vue.js设计与实现》 作者霍春阳,系统剖析Vue 3的响应式系统、虚拟DOM、编译器等…

vue实现数组排序

vue实现数组排序

vue实现数组排序的方法 在Vue中实现数组排序主要依赖JavaScript的数组排序方法,结合Vue的响应式特性确保视图同步更新。以下是几种常见实现方式: 使用JavaScript原生sort方法…