【VUE】Vue2中vm.$set 的实现原理

Vue2中的实现原理是通过defineReactive和Observer来实现的。具体步骤如下:

  • 如果目标是数组,直接使用数组的 splice 方法触发相应式;
  • 如果要更新对象属性,且这个属性不存在于对象中(即它是响应式数据的新增属性),那么Vue2会使用$set函数来进行设置;
  • vm.$set会先判断对象是否为响应式的,如果不是,则直接赋值即可,如果是,则继续执行以下步骤;

1.vm.$set会先调用Object.getOwnPropertyDescriptor方法获取对象属性描述符,如果该属性已存在,Vue2就不能将其转换成响应式属性了,因此直接返回;

  1. 如果属性不存在,则调用Object.defineProperty方法,给该属性添加getter和setter方法,并将其转换为响应式属性;

  2. 在setter方法中,更新属性值时,如果新值仍然是一个对象(或者数组),则递归调用observer函数进行深度观测,以便对新值的变化做出响应。

由于Vue2将对象属性转换为响应式属性的过程只需要在第一次调用$set时进行,所以后续直接使用对象属性的赋值操作就可以起到响应式更新效果。

相关推荐
张柏慈10 分钟前
JavaScript性能优化30招
开发语言·javascript·性能优化
EmmaGuo201541 分钟前
flutter3.7.12版本设置TextField的contextMenuBuilder的文字颜色
前端·flutter
pepedd8641 小时前
全面解析this-理解this指向的原理
前端·javascript·trae
渔夫正在掘金1 小时前
神奇魔法类:使用 createMagicClass 增强你的 JavaScript/Typescript 类
前端·javascript
雲墨款哥1 小时前
一个前端开发者的救赎之路-JS基础回顾(三)-Function函数
前端·javascript
猩猩程序员1 小时前
NAPI-RS v3:优化 Rust 与 前端 Node.js 跨平台支持
前端
艾小码1 小时前
CSS粘性定位失效?深度解析 position: sticky 的陷阱与解决方案
前端·css
小徐_23331 小时前
Trae 辅助下的 uni-app 跨端小程序工程化开发实践分享
前端·uni-app·trae
汪子熙1 小时前
深入理解 TypeScript 的 /// <reference /> 注释及其用途
前端·javascript