当前位置:首页 > VUE

vue set实现原理

2026-01-16 07:27:55VUE

Vue.set 的实现原理

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

vue set实现原理

响应式系统基础

Vue 的响应式系统通过 Object.defineProperty 或 Proxy(Vue 3)拦截对象的属性访问和修改。当初始化一个 Vue 实例时,会递归遍历 data 对象的所有属性,将其转换为 getter/setter。

vue set实现原理

对于数组,Vue 通过重写数组的变异方法(如 push、pop 等)来实现响应式。

Vue.set 的作用场景

  1. 对象属性动态添加:直接给对象添加新属性时,由于属性未被初始化时的 getter/setter 拦截,无法触发视图更新。
  2. 数组索引修改:直接通过索引修改数组元素(如 arr[0] = newValue)无法触发响应式更新。

源码实现分析

Vue.set 的核心逻辑如下:

function set (target, key, val) {
  // 检查目标是否为响应式对象
  if (process.env.NODE_ENV !== 'production' &&
    (isUndef(target) || isPrimitive(target))
  ) {
    warn('Cannot set reactive property on undefined, null, or primitive value')
  }

  // 处理数组情况
  if (Array.isArray(target) && isValidArrayIndex(key)) {
    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
}

关键点解析

  1. 数组处理:通过调用数组的 splice 方法触发响应式更新,因为 Vue 重写了数组的变异方法。
  2. 对象处理:通过 defineReactive 方法为新属性添加 getter/setter,使其成为响应式属性。
  3. 依赖通知:手动触发依赖收集器(dep.notify())通知所有订阅者进行更新。

使用示例

// 对象示例
let obj = { a: 1 }
Vue.set(obj, 'b', 2) // 添加响应式属性b

// 数组示例
let arr = [1, 2, 3]
Vue.set(arr, 1, 4) // 修改索引1的值为4

注意事项

  1. Vue 3 中使用的是 Proxy 实现响应式,因此不再需要 Vue.set,可以直接赋值。
  2. 对于嵌套对象,仍然需要确保父对象是响应式的才能正确触发更新。
  3. 在组件中更推荐使用 this.$set 实例方法,其原理与 Vue.set 相同。

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

相关文章

vue如何实现冒泡

vue如何实现冒泡

Vue 实现冒泡排序 在 Vue 中实现冒泡排序,可以通过数据绑定和响应式特性动态展示排序过程。以下是一个完整的实现示例,包含代码和详细说明。 数据准备 在 Vue 的 data 中定义一个数组作为…

vue手动实现弹窗

vue手动实现弹窗

实现弹窗组件的基本结构 在Vue中手动实现弹窗组件,需要创建一个独立的弹窗组件,并通过props控制其显示与隐藏。弹窗组件通常包含遮罩层、内容区域和关闭按钮。 <template>…

vue实现防抖节流

vue实现防抖节流

Vue 中实现防抖(Debounce) 防抖的核心是延迟执行函数,在连续触发时取消前一次的调用,只执行最后一次。适用于输入框搜索、窗口大小调整等场景。 方法1:使用 Lodash 的 _.debou…

vue实现全局遮罩层

vue实现全局遮罩层

实现全局遮罩层的方法 在Vue中实现全局遮罩层可以通过多种方式完成,以下是几种常见的实现方法: 使用Vue组件创建遮罩层 创建一个遮罩层组件,通过全局注册或动态挂载的方式实现全局调用。以下是一个简单…

vue实现签约合作弹窗

vue实现签约合作弹窗

实现签约合作弹窗的步骤 使用Vue实现签约合作弹窗可以通过组件化方式完成,结合模态框和表单交互逻辑。以下是具体实现方法: 1. 创建弹窗组件 新建一个Vue组件文件(如SignContractDi…

vue实现飘窗原理

vue实现飘窗原理

vue实现飘窗原理 飘窗效果通常指在页面上悬浮显示的弹窗或通知,跟随页面滚动或固定在某个位置。Vue实现这一效果主要依赖组件化开发、CSS定位和动态数据绑定。 组件结构设计 创建一个独立的Vue组件…