当前位置:首页 > 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 数组响应式实现

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实现横向导航的方法 使用Flex布局实现横向导航 在Vue中可以通过Flex布局快速实现横向导航。创建一个组件,使用display: flex和flex-direction: row属性使导航项…

vue实现继承语法糖

vue实现继承语法糖

在Vue中实现继承可以通过多种方式模拟类继承的效果,以下是常见的几种方法: 使用mixins实现逻辑复用 通过Vue的mixins机制共享组件选项,达到类似继承的效果: const BaseCom…

vue中登陆实现逻辑

vue中登陆实现逻辑

Vue 中登录实现逻辑 前端实现逻辑 表单验证 使用 Vue 的表单验证库(如 VeeValidate)或自定义验证规则,确保用户输入的账号和密码符合要求。例如,检查邮箱格式、密码长度等。 发送登录…

vue实现mouseout

vue实现mouseout

Vue 实现 mouseout 事件的方法 在 Vue 中实现 mouseout 事件可以通过多种方式完成,以下是几种常见的方法: 使用 v-on 指令 Vue 提供了 v-on 指令(或简写为 @…

vue实现ssr

vue实现ssr

Vue 实现 SSR(服务端渲染) Vue 的服务端渲染(SSR)允许在服务器端生成完整的 HTML 内容,再发送到客户端,提升首屏加载速度和 SEO 友好性。以下是实现 Vue SSR 的关键步骤和…

vue实现队列

vue实现队列

Vue 实现队列功能 在 Vue 中实现队列功能可以通过多种方式完成,以下是几种常见的方法: 使用数组模拟队列 队列遵循先进先出(FIFO)原则,可以用数组的 push 和 shift 方法模拟入队…