Vue3的响应式核心原理笔记
Vue2和Vue3响应式对比#
-
Vue2响应式基于
Object.defineProperty
原理实现(观察者模式和发布/订阅模式)当创建
Vue
实例时,vue
会遍历data
选项的属性- 数据劫持:通过
Object.defineProperty
为属性添加getter
和setter
对数据的读取进行劫持 - 依赖收集:通过
getter
进行依赖收集 - 派发更新:通过
setter
进行派发更新
每个组件实例都对应一个 watcher 实例,它会在组件渲染的过程中把“接触”过的数据 property 记录为依赖。之后当依赖项的 setter 触发时,会通知 watcher,从而使它关联的组件重新渲染。
- 数据劫持:通过
但是基于Object.defineProperty
特性无法检测未在data中声明的属性变化,并作出相应的更新
对象和数组都可以采用$set
的方式添加响应式的property
-
Vue3响应式原理是基于ES6的Proxy来实现
- 当一个值被读取时进行追踪:proxy 的
get
处理函数中track
函数记录了该 property 和当前副作用。 - 当某个值改变时进行检测:在 proxy 上调用
set
处理函数。 - 重新运行代码来读取原始值:
trigger
函数查找哪些副作用依赖于该 property 并执行它们。
- 当一个值被读取时进行追踪:proxy 的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现