当前位置:首页 > 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 实现菜单的方法 在 Vue 中实现菜单功能可以通过多种方式完成,以下是几种常见的方法: 使用 v-for 动态生成菜单项 通过数据驱动的方式,利用 v-for 指令动态渲染菜单项。定义一个…

vue前端实现下载进度

vue前端实现下载进度

实现下载进度条的基本思路 在Vue中实现下载进度条,通常需要结合XMLHttpRequest或Fetch API来监听下载进度事件。通过计算已下载数据与总数据的比例,动态更新进度条的显示。 使用XM…

vue实现https

vue实现https

Vue 中实现 HTTPS 的步骤 在 Vue 项目中实现 HTTPS 主要涉及开发环境配置和生产环境部署。以下是具体方法: 开发环境配置(Vue CLI 或 Vite) 使用 mkcert 生成…

vue实现闪烁

vue实现闪烁

Vue实现元素闪烁效果 使用CSS动画实现 通过Vue绑定class结合CSS动画实现闪烁效果,代码简洁且性能较好。 <template> <div :class="{…

vue slot实现

vue slot实现

vue slot 的实现方法 在 Vue 中,slot 是一种内容分发机制,允许父组件向子组件传递模板内容。以下是几种常见的 slot 实现方式: 默认 slot 默认 slot 是最基础的 slo…

vue实现盖章

vue实现盖章

Vue 实现盖章功能 在Vue中实现盖章功能通常涉及前端UI交互,通过Canvas或SVG绘制印章,并允许用户拖拽或点击放置印章。以下是具体实现方法: 使用Canvas绘制印章 通过HTML5的…