当前位置:首页 > VUE

vue数组实现原理

2026-01-07 01:18:36VUE

Vue 数组响应式原理

Vue 通过重写数组的原型方法来实现对数组变化的监听。具体实现基于 JavaScript 的原型继承和对象劫持技术。

核心实现机制

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

  • 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
  })
})

数组元素监听处理

对于数组中的对象元素,Vue 会递归地将它们转换为响应式对象。对于基本类型元素则不会进行监听,因为 JavaScript 的限制无法直接监听基本类型值的变化。

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

无法检测的情况

直接通过索引修改数组元素或修改数组长度不会被检测到:

vm.items[index] = newValue // 不会触发更新
vm.items.length = newLength // 不会触发更新

解决方案

使用 Vue.set 或数组的 splice 方法来触发响应式更新:

vue数组实现原理

Vue.set(vm.items, index, newValue)
// 或
vm.items.splice(index, 1, newValue)

性能优化考虑

Vue 选择只重写会改变数组内容的方法,而不是深度监听每个数组元素的变化,这种设计在性能和功能之间取得了平衡。对于大型数组,这种实现方式能显著减少性能开销。

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

相关文章

vue cli实现原理

vue cli实现原理

Vue CLI 的实现原理 Vue CLI 是一个基于 Node.js 的工具链,用于快速搭建 Vue.js 项目。其核心实现原理涉及模块化设计、插件系统、Webpack 封装等多个方面。 核心模块…

vue分页实现原理

vue分页实现原理

Vue 分页实现原理 Vue 分页的核心原理是通过计算当前页的数据范围,动态渲染数据列表并控制分页组件的交互。以下是关键实现步骤: 数据分片计算 分页需要根据当前页码和每页条数截取数据。假设原始数据…

vue实现数组绑定

vue实现数组绑定

Vue 数组绑定的实现方法 Vue 提供了多种方式实现数组的响应式绑定,确保数据变化时视图自动更新。以下是常见的实现方法: 使用 v-for 指令渲染数组 通过 v-for 指令可以遍历数组并渲染…

vue权限实现原理

vue权限实现原理

Vue权限实现原理 Vue权限控制的核心在于动态路由和组件级权限校验,通常结合后端返回的权限数据实现。以下是常见的实现方式: 路由级权限控制 路由级权限通过动态生成可访问路由表实现。用户登录后获取权…

react vue 实现原理

react vue 实现原理

React 实现原理 React 的核心思想是基于虚拟 DOM(Virtual DOM)和组件化开发。虚拟 DOM 是一个轻量级的 JavaScript 对象,用于描述真实 DOM 的结构。React…

vue compile实现原理

vue compile实现原理

Vue 编译实现原理 Vue 的编译过程是将模板字符串转换为渲染函数的过程,主要分为解析、优化和代码生成三个阶段。 解析阶段(Parser) 解析阶段将模板字符串转换为抽象语法树(AST)。Vue…