当前位置:首页 > 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.setthis.$set 修改数组元素
  • 使用 splice 方法替代直接赋值
  • 对于大规模数据更新,考虑使用 this.$forceUpdate()(不推荐频繁使用)

vue数组实现原理

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

相关文章

vue动态组建实现原理

vue动态组建实现原理

Vue 动态组件的实现原理 Vue 的动态组件主要通过 component 标签和 is 属性实现,核心原理涉及组件的动态切换和渲染机制。 动态组件的实现方式 使用 component 标签和…

vue rooter 实现原理

vue rooter 实现原理

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

vue如何实现原理

vue如何实现原理

Vue 的核心实现原理 Vue 的核心原理主要包括响应式系统、虚拟 DOM、模板编译和组件化。以下分模块详细说明其实现机制。 响应式系统 Vue 2.x 使用 Object.definePrope…

eventbus实现原理vue

eventbus实现原理vue

EventBus 的实现原理(Vue) EventBus 是 Vue 中实现跨组件通信的一种简单机制,其核心原理基于发布-订阅模式(Pub-Sub)。以下是其实现的关键点: 核心机制 事件中心 E…

vue cli实现原理

vue cli实现原理

Vue CLI 实现原理 Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统,其核心实现原理可以分为以下几个部分: 核心架构 Vue CLI 采用插件化架构,通过 @vue/cli…

css制作图文混排原理

css制作图文混排原理

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