当前位置:首页 > VUE

vue set实现原理

2026-02-17 08:35:38VUE

Vue.set 的实现原理

Vue.set 是 Vue.js 提供的一个全局 API,用于向响应式对象添加新属性并确保新属性也是响应式的。其核心原理基于 Vue 的响应式系统。

核心机制

Vue 的响应式系统通过 Object.defineProperty 或 Proxy(Vue 3)实现数据劫持。当直接给对象添加新属性时,由于属性未被劫持,无法触发视图更新。

Vue.set 内部会调用 defineReactive 方法,将新属性添加到对象并设置为响应式。对于数组,Vue 重写了数组的变异方法(如 push、splice),Vue.set 内部会调用这些方法确保数组变更能被检测到。

源码分析(Vue 2.x)

function set(target, key, val) {
  // 处理数组情况
  if (Array.isArray(target)) {
    target.length = Math.max(target.length, key)
    target.splice(key, 1, val)
    return val
  }

  // 对象已有属性直接赋值
  if (key in target && !(key in Object.prototype)) {
    target[key] = val
    return val
  }

  // 处理新增属性
  const ob = target.__ob__
  if (!ob) {
    target[key] = val
    return val
  }

  defineReactive(ob.value, key, val)
  ob.dep.notify()
  return val
}

关键点说明

defineReactive 方法会为新属性创建 Dep 依赖收集器,通过 Object.defineProperty 设置 getter/setter

对于数组类型,Vue.set 内部使用 splice 方法触发数组变更通知

对象新增属性时会通过 ob.dep.notify() 手动触发依赖更新

使用场景

动态添加对象新属性时

通过索引修改数组元素时(直接 arr[index]=value 不会触发更新)

vue set实现原理

需要确保新增数据能被响应式系统追踪时

标签: 原理vue
分享给朋友:

相关文章

vue实现适老化样式

vue实现适老化样式

Vue 实现适老化样式的关键方法 全局字体与字号调整 通过 CSS 变量或主题配置统一放大基础字号,建议正文不小于 18px,标题更大。在 App.vue 中设置全局样式: :root { --…

vue实现建模

vue实现建模

Vue 实现建模的方法 在 Vue 中实现建模通常涉及数据绑定、组件化和状态管理。以下是几种常见的方法: 数据驱动建模 Vue 的核心是数据驱动视图。通过定义数据模型,Vue 会自动更新 DOM。例…

vue filter 实现

vue filter 实现

在 Vue.js 中,过滤器(Filter)是一种用于文本格式化的功能,可以在模板中直接使用。以下是实现过滤器的详细方法: 全局过滤器注册 通过 Vue.filter 方法注册全局过滤器,可在所有组…

vue实现翻页

vue实现翻页

Vue实现翻页功能 在Vue中实现翻页功能通常需要结合分页组件和数据请求逻辑。以下是常见的实现方法: 使用Element UI分页组件 安装Element UI后,可以直接使用其分页组件:…

vue实现listview

vue实现listview

Vue 实现 ListView 的方法 基础列表渲染 使用 v-for 指令可以轻松实现基础列表渲染。在 Vue 中,v-for 用于遍历数组或对象,生成动态列表。 <template>…

vue递归实现

vue递归实现

vue递归实现方法 在Vue中实现递归组件通常用于树形结构、嵌套菜单等场景。以下是具体实现方式: 使用组件name属性递归 定义一个组件时,通过name属性让组件可以在自身模板中调用自己:…