当前位置:首页 > VUE

vue set实现原理

2026-03-29 08:04:13VUE

Vue.set 的实现原理

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

响应式系统的核心

Vue 使用 Object.defineProperty(Vue 2.x)或 Proxy(Vue 3.x)来实现数据的响应式。对于对象,Vue 会递归地将所有属性转换为 getter/setter,从而在属性被访问或修改时触发依赖收集和更新。

Vue.set 的作用场景

当直接通过普通方式(如 obj.newProperty = value)向响应式对象添加新属性时,新属性不会触发视图更新,因为它未被 Vue 的响应式系统追踪。Vue.set 解决了这一问题。

vue set实现原理

实现逻辑

  1. 检查目标对象
    如果目标对象是数组,且传入的键是有效的数组索引,则调用数组的 splice 方法(Vue 重写的响应式方法)触发更新。

    if (Array.isArray(target) && isValidArrayIndex(key)) {
      target.length = Math.max(target.length, key)
      target.splice(key, 1, val)
      return val
    }
  2. 处理对象属性
    如果属性已存在于对象中且不是通过 Object.defineProperty 设置的(即非响应式),直接赋值并返回。

    vue set实现原理

    if (key in target && !(key in Object.prototype)) {
      target[key] = val
      return val
    }
  3. 触发响应式更新
    如果对象是 Vue 实例或根数据对象($data),则不允许动态添加属性。否则,通过 defineReactive 方法将新属性转换为响应式,并手动触发依赖通知。

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

源码关键点

  • defineReactive:为属性定义 getter/setter,实现响应式。
  • ob.dep.notify():通知所有依赖该对象的 Watcher 更新视图。
  • 数组处理的特殊逻辑:Vue 重写了数组的变异方法(如 pushsplice),确保数组操作能触发响应式更新。

Vue 3 的变更

在 Vue 3 中,Vue.set 被移除,因为基于 Proxy 的响应式系统可以自动检测新增属性,无需手动处理。

使用示例

Vue.set(vm.someObject, 'newProperty', 'value')
// 或实例方法
this.$set(this.someObject, 'newProperty', 'value')

通过 Vue.set,开发者可以确保动态添加的属性具备响应式能力,从而避免视图更新失效的问题。

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

相关文章

vue列表实现

vue列表实现

Vue 列表实现方法 使用 v-for 指令 v-for 是 Vue 中用于渲染列表的核心指令,基于数据源动态生成 DOM 元素。语法格式为 item in items 或 (item, index)…

vue实现分栏

vue实现分栏

Vue实现分栏的常见方法 使用CSS Flexbox布局 通过Flexbox可以快速实现分栏效果,适合大多数响应式布局场景 <template> <div class="con…

vue 实现templateurl

vue 实现templateurl

在 Vue 中,templateUrl 是 Angular 中的一个概念,用于指定外部 HTML 文件作为模板。Vue 本身不直接支持 templateUrl,但可以通过以下方法实现类似功能: 使用…

vue实现肢体识别

vue实现肢体识别

Vue 中实现肢体识别的方法 在 Vue 项目中实现肢体识别通常需要结合第三方库或 API,例如 TensorFlow.js、MediaPipe 或 OpenCV。以下是几种常见的实现方式: 使用…

vue实现列表循环

vue实现列表循环

Vue 列表循环的实现方法 在 Vue 中,可以通过 v-for 指令实现列表循环渲染。以下是几种常见的实现方式: 基础列表渲染 <template> <ul>…

vue实现下拉

vue实现下拉

Vue 实现下拉功能 使用原生 HTML 和 Vue 指令 通过 Vue 的 v-model 和 v-show 或 v-if 指令实现简单的下拉功能。 <template> <…