当前位置: 首页 > news >正文

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] = valreturn val}const ob = target.__ob__  // 这是 Observer 实例if (!ob) {target[key] = valreturn 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 2Vue 3
添加响应式属性需要 $set不需要,直接赋值即可
实现机制Object.defineProperty + defineReactiveProxy 拦截所有操作
数组监听依赖重写 push/splice 等方法Proxy 完整拦截

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

相关文章:

  • AIO-1126-JD4蓝牙通讯(BLE)
  • Lucene并不是只有倒排索引一种数据结构,支持多种数据结构
  • Angular教程前言:历史、安装与用途
  • Webug4.0靶场通关笔记08- 第11关万能密码登录(SQL注入漏洞)
  • 数字智慧方案5968丨智慧农业产销一体化云平台建设方案(72页PPT)(文末有下载方式)
  • 【Docker】Dockerfile 使用
  • python如何把pdf转word
  • 高等数学-第七版-下册 选做记录 习题9-7
  • C++11新特性_自动类型推导_auto
  • 【RocketMQ】- 源码系列目录
  • 神经网络—损失函数
  • Windows服务器提权实战:常见方法、场景与防御指南
  • 2025五一杯C题五一杯数学建模思路代码文章教学:社交媒体平台用户分析问题
  • 【精选】基于数据挖掘的广州招聘可视化分析系统(大数据组件+Spark+Hive+MySQL+AI智能云+DeepSeek人工智能+深度学习之LSTM算法)
  • 【playwright】内网离线部署playwright
  • UE实用地编插件Physical Layout Tool
  • 深度学习-神经网络参数优化的约束与迭代策略
  • PCIe 中的 ARI 介绍
  • 2025五一数学建模ABC题选题建议,思路模型分析
  • 彩带飘落效果
  • 亚马逊一季度利润增超六成:云业务增速放缓,警告关税政策或影响业绩指引
  • 新华时评:需要“重新平衡”的是美国心态
  • 美国务院宣布新一轮与伊朗相关的制裁
  • 马上评|科学谋划“十五五”,坚定不移办好自己的事
  • 国台办:提醒相关人员不要假借去第三地名义绕道赴台
  • 深圳一季度GDP为8950.49亿元,同比增长5.2%