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

前端面试题(八):简述Vue2的响应式原理

Vue 2 的响应式原理主要基于 数据劫持发布-订阅模式,通过 Object.defineProperty 对对象的属性进行拦截,实现数据的监控与视图更新。具体原理如下:

1. 数据劫持:Object.defineProperty

Vue 2 在初始化过程中,通过 Object.defineProperty 给对象的每一个属性添加 gettersetter,来劫持数据的访问和修改。

  • getter: 当访问该属性时,Vue 会触发 getter,在这个过程中 Vue 会将当前的 watcher(即视图中的依赖)收集到该属性的依赖列表中。这样,当该属性发生变化时,相关的视图就能知道并做出更新。
  • setter: 当修改该属性的值时,Vue 会触发 setter,然后触发依赖更新(通过通知 watcher 进行视图的重新渲染)。

2. 依赖收集:DepWatcher

Vue 2 中使用了 DepWatcher 对象来实现依赖收集和视图更新:

  • Dep: 每个数据属性(通过 Object.defineProperty 劫持的属性)都会有一个对应的 Dep 对象,负责管理该属性的所有依赖(即需要观察该属性的视图、计算属性等)。当该数据发生变化时,Dep 会通知所有依赖该属性的 watcher 进行更新。

  • Watcher: 在 Vue 组件中,每个组件实例都对应着一个 Watcher,它会监听模板中使用到的响应式数据。Watcher 会在数据发生变化时进行相应的视图更新。

3. 发布-订阅模式

  • 发布者: 数据对象通过 Object.defineProperty 拦截属性的访问和修改,作为发布者。
  • 订阅者: 视图(watcher)和计算属性等是订阅者,它们会在数据变化时进行相应的更新。通过 Dep,每当数据发生变化时,Dep 会通知所有相关的 watcher,从而触发视图更新。

4. 视图更新

当数据发生变化时,setter 会触发 Dep 的通知机制,Dep 会遍历所有依赖它的 watcher,然后更新视图。Vue 会通过 虚拟 DOM 比对前后差异(即 diff 算法),然后将差异应用到实际的 DOM 上,从而实现视图的更新。

总结

  • Vue 2 通过 Object.defineProperty 劫持数据的 gettersetter,来监听数据的访问和修改。
  • 使用 DepWatcher 实现 依赖收集视图更新
  • 视图变化时,watcher 触发更新,通过 虚拟 DOMdiff 算法 优化性能,最终更新真实 DOM。

Vue 2 的响应式系统基于数据劫持和发布-订阅模式,提供了数据和视图的双向绑定机制,简化了开发过程中的 DOM 操作。

相关文章:

  • mysql自动赋值
  • C语言题目自增在前与在后
  • CentOS服务器能ping通却无法yum install:指定镜像源解决
  • 在思科模拟器show IP route 发现Gateway of last resort is not set没有设置最后的通道
  • One-Hot标签编码方法详解
  • 机器学习概述自用笔记(李宏毅)
  • mysql DQL
  • 「小推桌面官方下载」小推桌面TV版-安卓电视版官方免费下载新版
  • 【KWDB创作者计划】_KWDB部署与使用详细版本
  • 批量将多个文件夹转成压缩包,支持设置压缩密码
  • 【数据库系统概论】第3章 SQL(四)视图(超详细)
  • 5 C 程序全流程解析:编写、预处理、编译、汇编、链接、运行与 GCC 指令详解
  • 【C++ Qt】认识Qt、Qt 项目搭建流程(图文并茂、通俗易懂)
  • 【Spring】IoC详解:方法Bean的存储、Bean重命名、扫描路径@Component(下)
  • 计算机操作系统——存储器管理
  • Android 日志输出模块
  • 现在AI大模型能帮做数据分析吗?
  • ScholarCopilot:“学术副驾驶“
  • 【数据结构】励志大厂版·初阶(复习+刷题):复杂度
  • SpringBoot条件注解全解析:核心作用与使用场景详解
  • 病人有头发,照护者不发疯:《黑镜》中的身体缺席与虚伪关怀
  • 遭遇大规模停电,西班牙内政部宣布进入国家紧急状态
  • 港理大公布多项AI+医工成果,助港建设国际医疗创新枢纽
  • 现场|西岸美术馆与蓬皮杜启动新五年合作,新展今开幕
  • 五万吨级半潜船在沪完成装备装载
  • 商超展销延长、专区专柜亮相……上海“外贸拓内销”商品与市民见面