当前位置:首页 > VUE

vue数组实现原理

2026-01-11 23:48:38VUE

Vue 数组响应式原理

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

实现机制

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

数组响应式处理流程

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

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

    vue数组实现原理

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

注意事项

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

替代方案

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

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

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

相关文章

vue实现绑卡的原理

vue实现绑卡的原理

Vue 实现绑卡的原理 Vue 实现绑卡功能通常涉及前端表单处理、数据绑定、验证以及和后端 API 的交互。以下是实现绑卡功能的核心原理和步骤: 数据绑定与表单处理 Vue 通过 v-model 指…

vue rooter 实现原理

vue rooter 实现原理

Vue Router 实现原理 Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。其核心实现原理包括路由匹配、组件渲染和导航守卫等机制。 路由匹配与动态路由 V…

css制作图文混排原理

css制作图文混排原理

CSS 图文混排原理 图文混排主要通过 CSS 的浮动、定位、弹性布局或网格布局实现,核心是控制文本与图片的相对位置和环绕效果。 浮动(Float)实现环绕 使用 float 属性让图片浮动到左侧…

vue实现检测数组

vue实现检测数组

检测数组变化的方法 在Vue中,可以通过多种方式检测数组的变化。Vue本身对数组的某些方法进行了响应式处理,但某些情况下需要手动触发更新或使用特定方法。 使用Vue.set或this.$set 对于…

vue核心实现原理详解

vue核心实现原理详解

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

vue动态组建实现原理

vue动态组建实现原理

Vue动态组件的实现原理 Vue的动态组件主要通过<component>标签和is属性实现,其核心原理涉及以下机制: 动态组件基础语法 <component :is="curren…