当前位置:首页 > VUE

vue 数组响应式实现

2026-01-22 04:48:41VUE

Vue 数组响应式实现原理

Vue 通过重写数组的原型方法来实现对数组操作的响应式监听。具体实现基于以下机制:

拦截数组变异方法

Vue 创建了一个继承自原生 Array 原型的对象,并重写了以下会改变原数组的方法:

  • push
  • pop
  • shift
  • unshift
  • splice
  • sort
  • reverse
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
  })
})

依赖收集与通知

每个被观察的数组都有一个关联的 Observer 实例,其中包含一个 Dep 依赖收集器。当数组被修改时,会通过 dep.notify() 通知所有依赖的 Watcher 进行更新。

数组元素观测

对于数组中的对象元素,Vue 会递归地进行响应式处理:

Observer.prototype.observeArray = function observeArray (items) {
  for (let i = 0, l = items.length; i < l; i++) {
    observe(items[i])
  }
}

处理数组索引修改

直接通过索引修改数组元素或修改数组长度不会触发响应式更新:

// 不会触发响应式更新
vm.items[0] = newValue
vm.items.length = 0

对于这种情况,应该使用 Vue.set 或数组的 splice 方法:

Vue.set(vm.items, 0, newValue)
vm.items.splice(0, 1, newValue)

实现细节

  1. 在初始化阶段,Vue 会检查数据是否为数组,如果是则修改其 proto 指向重写后的数组方法对象
  2. 对于新增的数组元素(如通过 push 添加的元素),会进行额外的响应式处理
  3. 数组的依赖收集与其他响应式数据使用相同的 Dep/Watcher 机制

这种实现方式既保持了 JavaScript 数组的原生性能,又实现了响应式更新,是 Vue 响应式系统的重要设计之一。

vue 数组响应式实现

标签: 数组vue
分享给朋友:

相关文章

vue实现视频开场

vue实现视频开场

使用 Vue 实现视频开场动画 在 Vue 中实现视频开场动画可以通过结合 HTML5 的 <video> 标签和 Vue 的过渡效果或生命周期钩子来完成。以下是具体实现方法: 安装依赖…

vue实现网页切换

vue实现网页切换

Vue 实现网页切换的方法 在 Vue 中实现网页切换通常可以通过以下几种方式完成,具体取决于项目需求和路由管理方式。 使用 Vue Router Vue Router 是 Vue.js 官方提供的…

vue实现一个标签选择

vue实现一个标签选择

Vue 标签选择组件实现 基础实现 使用 Vue 的 v-for 和 v-model 指令可以快速实现标签选择功能: <template> <div class="tag-s…

eventbus vue实现

eventbus vue实现

EventBus 实现原理 EventBus 是一种发布/订阅模式,用于 Vue 组件间的通信。核心是通过一个中央事件总线管理事件监听和触发。 创建 EventBus 在 Vue 项目中创建一个独立…

vue实现公告

vue实现公告

Vue 实现公告功能的方法 公告功能通常需要实现滚动展示、自动切换或固定显示的效果。以下是几种常见的实现方式: 使用 marquee 标签实现滚动公告 <template> <…

vue实现删除

vue实现删除

Vue 实现删除功能的方法 在 Vue 中实现删除功能通常涉及以下几个步骤: 数据绑定与列表渲染 使用 v-for 指令渲染列表数据,并为每个项绑定唯一标识符(如 id)。例如: <ul…