当前位置:首页 > VUE

vue数组实现原理

2026-03-26 21:16:18VUE

Vue 数组响应式原理

Vue 通过重写数组的变异方法(如 pushpopsplice 等)来实现数组的响应式。当这些方法被调用时,Vue 能够检测到变化并触发视图更新。

重写的数组方法

Vue 重写了以下数组方法:

  • push
  • pop
  • shift
  • unshift
  • splice
  • sort
  • reverse

这些方法被调用时,Vue 会执行以下操作:

vue数组实现原理

  1. 调用原始的数组方法完成数据变更。
  2. 通知依赖(Watcher)进行更新。

实现细节

Vue 通过 Object.create(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
  })
})

无法检测的情况

Vue 无法检测以下数组变动:

  1. 通过索引直接设置项:vm.items[index] = newValue
  2. 修改数组长度:vm.items.length = newLength

解决方法:

// 使用 Vue.set 或 this.$set
Vue.set(vm.items, index, newValue)

// 使用 splice
vm.items.splice(index, 1, newValue)

对象数组的响应式

对于对象数组,Vue 会对数组中的每个对象进行响应式处理。当对象属性发生变化时,也能触发视图更新。

性能考虑

Vue 没有对数组的每个索引都进行响应式处理,而是通过重写变异方法来实现。这种设计在性能和功能之间取得了平衡。

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

相关文章

vue实现数组平均值

vue实现数组平均值

计算数组平均值的方法 在Vue中计算数组的平均值可以通过多种方式实现。以下是几种常见的方法: 方法一:使用计算属性 export default { data() { return {…

vue的原理实现

vue的原理实现

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

php购物车的实现原理

php购物车的实现原理

购物车基本概念 购物车是电子商务网站的核心功能之一,允许用户临时存储选中的商品,支持增删改查操作,最终生成订单。PHP实现通常结合Session或数据库存储数据。 Session存储实现 使用PHP…

vue watch实现原理

vue watch实现原理

Vue 的 watch 实现原理 Vue 的 watch 功能基于响应式系统的依赖收集和派发更新机制实现。核心原理是通过监听数据变化并触发回调函数。 依赖收集阶段 在组件初始化时,Vue 会遍历 w…

vue 实现数组排序

vue 实现数组排序

在 Vue 中实现数组排序的方法 使用 JavaScript 原生排序方法 Vue 中可以直接调用 JavaScript 的 Array.prototype.sort() 方法对数组进行排序。对于数字…

vue vif实现原理

vue vif实现原理

Vue v-if 实现原理 Vue 的 v-if 指令通过条件渲染控制 DOM 元素的显示与隐藏。其实现原理基于虚拟 DOM 和编译阶段的代码生成。 编译阶段 模板中的 v-if 会被编译为渲染函数…