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

簡述Vue 2.0 响应式数据的原理

Vue 2.0 响应式数据的原理主要基于以下几个关键点:

  1. 数据劫持与Object.defineProperty

    • Vue 2.0 使用 Object.defineProperty 方法来劫持对象的属性,为其添加 getter 和 setter 方法。当数据被访问或修改时,这些 getter 和 setter 方法会被触发。
    • 当 Vue 实例初始化时,它会遍历 data 对象中的每一个属性,并使用 Object.defineProperty 将它们转化为 getter/setter,从而实现对数据的劫持。
  2. 依赖收集与Dep实例

    • 当一个属性被访问时(即 getter 被触发),Vue 会创建一个 Dep 实例(依赖收集器),并将当前的 Watcher 实例(观察者)添加到该 Dep 实例的订阅者列表中。
    • 这样,Vue 就建立了属性和依赖之间的关系,形成了一个响应式的数据依赖系统。
  3. Watcher实例

    • Watcher 是 Vue 的一个核心组件,用于观察和响应 Vue 实例上的数据变化。
    • 当数据发生变化时(即 setter 被触发),Dep 实例会通知所有订阅的 Watcher 实例,Watcher 实例会重新计算并更新相应的视图。
  4. 数组变更检测

    • Vue 2.0 不能检测到以下变动的数组:
      • 当你利用索引直接设置一个项时,例如:vm.items[indexOfItem] = newValue
      • 当你修改数组的长度时,例如:vm.items.length = newLength
    • 为了解决这些问题,Vue 提供了 Vue.setvm.$set 方法来确保这些变更能够被检测到。
  5. 发布-订阅模式

    • Vue 的响应式系统实际上是一个典型的发布-订阅模式。当数据发生变化时(发布事件),所有订阅了该数据的 Watcher 实例都会收到通知(订阅者收到事件),并触发相应的更新操作。
  6. 异步更新队列

    • Vue 在更新 DOM 时是异步执行的。当数据发生变化时,Vue 并不会立即更新 DOM,而是将更新操作放入一个队列中,等到下一个“tick”(通常是下一个事件循环)才进行实际的 DOM 更新。这样可以避免多次修改数据导致的频繁 DOM 操作,从而提高性能。

归纳来说,Vue 2.0 的响应式数据原理是通过 Object.defineProperty 劫持对象的属性,利用 Dep 和 Watcher 实例建立属性和依赖之间的关系,并使用发布-订阅模式来通知依赖进行更新操作。同时,Vue 通过异步更新队列来优化 DOM 操作的性能。

http://www.lryc.cn/news/354789.html

相关文章:

  • Kafka线上集群部署方案怎么做?no.6
  • vscode 的 AI 协助插件 Tabnine / Codeium
  • Flutter 中的 OutlineButton 小部件:全面指南
  • Kubernetes可视化界面之DashBoard
  • Docker学习(4):部署web项目
  • 驱动开发中引入私有数据的原因
  • 删除edge浏览器文本框储存记录值以及关闭自动填充
  • mysql事务 事务并发问题 隔离级别 以及原理
  • Android 性能为王时代SparseArray和HashMap一争高下
  • 学术图表的基本配色方法
  • 【学习笔记】Webpack5(Ⅱ)
  • oracle碎片整理
  • 民国漫画杂志《时代漫画》第15期.PDF
  • Alamofire常见GET/POST等请求方式的使用,响应直接为json
  • 三分钟一条AI小和尚视频 ,日引300+创业粉。单日变现四位数 全套工具
  • vue3中表格中通过判断某个字段来设置对应按钮和消息提示的disabled展示
  • 产品经理-交互说明撰写(八)
  • Rust:struct 与字节序列的相互转换
  • 在https的系统中挂载其他http系统的画面的解决方案
  • mysql存储比特位
  • Lua中table.sort()使用方式
  • 数组与指针声明小问题
  • 【Java】手把手学会数组的使用
  • 音视频开发9 FFmpeg 解复用框架--如何将一个影音文件(mp4文件/wav文件) 最终播放起来
  • vue实现页面渲染时候执行某需求
  • Python小游戏——俄罗斯方块
  • Moto和Inter字节序
  • 外汇天眼:野村证券和Laser Digital与GMO互联网集团合作发行日元和美元稳定币
  • Python怎么使用getattr?
  • [算法] 优先算法(三):滑动窗口(上)