Vue2与Vue3的响应式原理
理解Vue2的响应式原理
Vue2是通过Object.defineProperty()来拦截数据,将数据转换成getter/setter的形式,在访问数据时调用getter函数,在修改数据时调用setter函数。然后利用发布-订阅模式,在数据变动时触发依赖,也即发布更新给订阅者,订阅者收到消息后进行相应的处理。在源码中,主要涉及三个类:
- Observer
作为数据的观察者,在初始化实例时会递归地遍历data,内部封装了Object.defineProperty()来拦截数据,将数据转换成getter/setter的形式来追踪变化。对于数组类型的数据,由于它们不像Object类型那样有getter/setter,因此这里是通过自定义方法来覆盖原生的原型方法实现拦截。
- Dep
作为数据更新的发布者,在get数据时收集那些订阅了该数据的Watcher;然后在set数据时发布更新,通知相应的Wacther数据已经发生更改。
- Watcher
作为数据的订阅者,也就是“依赖”。订阅的数据发生改变时会向外界发送通知,触发视图更新或触发用户的某个回调函数。
缺陷:
对于Object类型的数据,getter/setter只能追踪一个数据是否被修改,无法追踪数据是否新增或删除属性。因此,Vue2中提供了Vue.set()和Vue,delete()方法来添加或删除属性,确保新添加的属性也具有响应式。
对于数组类型的数据,一些不调用原型方法修改数据的方式,Vue2也监测不到。
对于深度监听需要一次性进行递归遍历,影响性能。
理解Vue3响应式原理
Vue3基于ES6新增的Proxy对象实现数据代理以及通过Reflect对源数据进行操作,它解决了Vue2中无法追踪数据新增或删除属性的问题。另外,Proxy可以直接监听数组,无需像Vue2响应式那样需要重写数组方法进行拦截。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)