【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时进行,所以后续直接使用对象属性的赋值操作就可以起到响应式更新效果。

相关推荐
zhougl9961 小时前
html处理Base文件流
linux·前端·html
花花鱼1 小时前
node-modules-inspector 可视化node_modules
前端·javascript·vue.js
HBR666_1 小时前
marked库(高效将 Markdown 转换为 HTML 的利器)
前端·markdown
careybobo2 小时前
海康摄像头通过Web插件进行预览播放和控制
前端
TDengine (老段)3 小时前
TDengine 中的关联查询
大数据·javascript·网络·物联网·时序数据库·tdengine·iotdb
杉之4 小时前
常见前端GET请求以及对应的Spring后端接收接口写法
java·前端·后端·spring·vue
喝拿铁写前端4 小时前
字段聚类,到底有什么用?——从系统混乱到结构认知的第一步
前端
再学一点就睡4 小时前
大文件上传之切片上传以及开发全流程之前端篇
前端·javascript
木木黄木木5 小时前
html5炫酷图片悬停效果实现详解
前端·html·html5
请来次降维打击!!!6 小时前
优选算法系列(5.位运算)
java·前端·c++·算法