当前位置:首页 > VUE

vue数组实现原理

2026-02-09 12:34:24VUE

Vue 数组响应式原理

Vue 通过重写数组的变异方法(如 pushpopshiftunshiftsplicesortreverse)来实现对数组变化的监听。这些方法被修改后,会在执行原有逻辑的同时触发视图更新。

核心实现机制

Vue 使用 Object.defineProperty 对数组的变异方法进行拦截。具体步骤如下:

  1. 创建拦截器对象
    定义一个对象,包含与原生数组方法同名的方法,但在执行时会额外触发依赖通知。

    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__
        ob.dep.notify()
        return result
      })
    })
  2. 覆盖目标数组的原型
    当 Vue 初始化数据时,如果遇到数组,会将数组的原型指向自定义的拦截器对象。

    if (Array.isArray(value)) {
      const augment = hasProto
        ? protoAugment
        : copyAugment
      augment(value, arrayMethods, arrayKeys)
      this.observeArray(value)
    }
  3. 处理新增元素
    对于 pushunshiftsplice 等方法新增的元素,Vue 会遍历这些新元素并将其转换为响应式数据。

    if (inserted) ob.observeArray(inserted)

无法检测的情况

由于 JavaScript 的限制,Vue 无法检测以下数组变动:

  • 直接通过索引设置项(如 arr[0] = newValue
  • 修改数组长度(如 arr.length = 0

解决方法:

  • 使用 Vue.setvm.$set
    Vue.set(arr, index, newValue)
  • 使用 splice
    arr.splice(index, 1, newValue)

源码关键点

在 Vue 2.x 源码中,数组响应式处理主要在 src/core/observer/index.jssrc/core/observer/array.js 文件中实现。核心是通过拦截数组方法并触发依赖更新,同时对新元素进行响应式处理。

vue数组实现原理

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

相关文章

vue中样式的实现原理

vue中样式的实现原理

Vue 中样式的实现原理 Vue 的样式处理机制基于其核心的响应式系统和虚拟 DOM 技术,通过编译、作用域隔离和动态绑定实现高效的样式管理。 样式作用域隔离 Vue 的单文件组件(SFC)通过…

vue extend实现原理

vue extend实现原理

Vue.extend 的实现原理 Vue.extend 是 Vue.js 中用于创建子类构造函数的全局方法,其核心原理基于 JavaScript 的原型继承机制。以下是其关键实现逻辑: 原型继承与构…

java如何输出数组

java如何输出数组

输出数组的方法 在Java中,输出数组内容有多种方式,具体取决于数组类型和输出格式需求。以下是几种常见的方法: 使用Arrays.toString()方法 适用于一维数组,直接调用Arrays.to…

vue插件实现原理

vue插件实现原理

Vue 插件实现原理 Vue 插件的核心是通过暴露一个 install 方法,在 Vue 应用初始化时被调用,从而扩展 Vue 的功能。插件可以添加全局方法、指令、混入、组件等。 插件基本结构 一个…

vue分页实现原理

vue分页实现原理

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

css动画制作原理

css动画制作原理

CSS动画制作原理 CSS动画通过改变元素的样式属性实现动态效果,主要依赖关键帧(@keyframes)和动画属性(如animation-name、animation-duration)的配合。核心原…