vue中$set原理

Vue 中的 $set 方法(Vue.set)主要用于 向响应式对象中添加一个新的属性,并确保这个新属性是响应式的,能够触发视图更新。


📌 背景问题:为什么需要 $set

在 Vue 2 中,直接给对象新增属性不会触发视图更新,例如:

复制代码
this.obj.a = 123 // 如果 a 原本不存在,则不会触发视图更新

这是因为 Vue 2 是基于 Object.defineProperty 来实现响应式系统的,它在对象初始化时只能"劫持"已有属性,无法监控新增的属性


$set 的作用

复制代码
this.$set(obj, key, value)

或者

复制代码
Vue.set(obj, key, value)

它的作用是:

  1. 为对象添加新属性

  2. 让这个新属性是响应式的

  3. 触发视图更新


🧠 原理解析(Vue 2)

复制代码
Vue.set = function (target, key, val) {
  if (Array.isArray(target) && isValidIndex(key)) {
    // 对数组使用 splice 替代设置
    target.splice(key, 1, val)
    return val
  }

  if (key in target && !(key in Object.prototype)) {
    target[key] = val
    return val
  }

  const ob = target.__ob__  // 这是 Observer 实例
  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()


🧪 示例

复制代码
<template>
  <div>{{ user.name }}</div>
  <button @click="addProp">添加新属性</button>
</template>

<script>
export default {
  data() {
    return {
      user: {}
    }
  },
  methods: {
    addProp() {
      this.$set(this.user, 'name', '张三') // 触发视图更新
    }
  }
}
</script>

🆕 Vue 3 呢?

Vue 3 中,由于使用了 Proxy 实现响应式,不需要 $set,你可以直接赋值:

复制代码
reactiveObj.newKey = 123 // ✅ 直接响应式,无需 $set

🧩 总结

项目 Vue 2 Vue 3
添加响应式属性 需要 $set 不需要,直接赋值即可
实现机制 Object.defineProperty + defineReactive Proxy 拦截所有操作
数组监听 依赖重写 push/splice 等方法 Proxy 完整拦截

需要我帮你用简单代码实现一个简化版的 $set 吗?可以更好理解它的内部逻辑。

相关推荐
a1117767 分钟前
实验室预约管理系统(开源 FastAPI + Vue )
vue.js·开源·fastapi
念念不忘 必有回响7 分钟前
码云流水线前端资源传输至目标服务器
运维·服务器·前端
我是伪码农15 分钟前
Vue 2.2
前端·javascript·vue.js
●VON18 分钟前
React Native for OpenHarmony:深入剖析 Switch 组件的状态绑定、无障碍与样式定制
javascript·学习·react native·react.js·von
时光追逐者35 分钟前
一个基于 .NET + Vue 实现的通用权限管理平台(RBAC模式),前后端分离模式,开箱即用!
前端·vue.js·c#·.net·.net core
Aotman_37 分钟前
Vue el-table 表尾合计行
前端·javascript·vue.js·elementui·前端框架·ecmascript
编程猪猪侠40 分钟前
Vue3 + Ant Design Vue 实现 Table 表格嵌套 Radio 单选框
javascript·vue.js·anti-design-vue
phltxy44 分钟前
Vue3 + Vite:从入门到实战——核心指令全解析
vue.js·vue
静小谢1 小时前
vue3实现语言切换vue-i18n
前端·javascript·vue.js
Highcharts.js1 小时前
如何使用Highcharts Flutter的官方使用文档
javascript·flutter·开发文档·highcharts