当前位置:首页 > 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 实现选择季度的几种方法 使用下拉选择框(Select) 在 Vue 中可以通过 v-model 绑定一个下拉选择框来实现季度选择。数据可以预先定义为一个包含季度选项的数组。 <…

vue实现查询替换

vue实现查询替换

Vue 实现查询替换功能 在 Vue 中实现查询替换功能,可以通过数据绑定和字符串操作方法结合实现。以下是具体实现方式: 基础实现 <template> <div>…

vue前端实现打印功能

vue前端实现打印功能

使用Vue实现前端打印功能 在Vue项目中实现打印功能可以通过多种方式完成,以下是几种常见的方法: 使用window.print()方法 这是最简单的打印方式,直接调用浏览器的打印功能。 me…

vue实现冰墩墩

vue实现冰墩墩

使用 Vue 实现冰墩墩动画 通过 Vue 的动画特性和 SVG 技术,可以动态渲染冰墩墩的形象。以下是具体实现方法: 准备 SVG 素材 冰墩墩的形象通常由多个 SVG 路径组成,包括身体轮廓…

vue前端分页怎么实现

vue前端分页怎么实现

前端分页实现方法 在Vue中实现前端分页通常涉及数据分割和页面控制逻辑。以下是常见的实现方式: 使用计算属性分页 通过计算属性对数据进行切片处理: computed: { paginate…

vue实现自定义登录

vue实现自定义登录

实现自定义登录的基本步骤 在Vue中实现自定义登录功能通常需要结合前端和后端技术。以下是一个基本的实现流程: 创建登录表单组件 使用Vue的单文件组件创建一个登录表单,包含用户名和密码输入框以及提…