首页 > 其他分享 >vue 响应式数据原理

vue 响应式数据原理

时间:2024-12-19 09:57:01浏览次数:7  
标签:vue 视图 响应 Vue 原理 getter setter 数据 属性

发现宝藏

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【宝藏入口】。


Vue 的响应式数据原理是其核心功能之一,它使得 Vue 应用能够自动响应数据的变化,并在数据变化时自动更新视图。这个机制通过 数据劫持(data hijacking)和 发布-订阅模式 实现,下面我将详细解释 Vue 响应式数据原理。

1. 数据劫持 (Data Hijacking)

Vue 的响应式数据机制基于浏览器的 Object.defineProperty,通过数据劫持将对象的每个属性转化为 getter 和 setter。当你访问某个属性时,getter 会被触发;当你修改该属性的值时,setter 会被触发。

实现过程:

  1. 对象属性代理
    当 Vue 初始化数据时,它会遍历每个数据对象的属性,并通过 Object.defineProperty 对每个属性进行封装,定义 getter 和 setter。

    • Getter:每当你访问该属性时,getter 会被调用。在 getter 内部,Vue 会将这个属性的依赖(通常是视图组件)进行收集。
    • Setter:每当你修改该属性时,setter 会被调用。在 setter 内部,Vue 会通知所有依赖该属性的视图组件重新渲染。
  2. 数据变化的通知机制
    Vue 会维护一个 依赖收集 的过程,当某个视图依赖于某个数据属性时,视图会注册为该数据的观察者。这样,当数据变化时,Vue 就会通知这些依赖,触发相应的视图更新。

2. 依赖收集 (Dependency Collection)

Vue 使用一个 ObserverWatcher 机制来管理数据变化和视图更新。

  • Observer(观察者):Vue 会对每个数据对象进行劫持,并为每个属性创建一个 Observer 对象。这个对象负责数据的 getter 和 setter 操作,同时负责收集依赖。

  • Watcher(观察者):每个组件或者视图实例中的计算属性和渲染函数都可以视为一个 Watcher。当某个数据属性变化时,Watcher 会被通知,进而触发视图更新。

当一个组件访问某个响应式数据时,Vue 会将该组件的 Watcher 作为该数据属性的依赖(即让组件 “订阅” 数据属性的变化)。当数据属性改变时,Vue 会通知所有订阅了该属性的 Watcher,从而触发视图更新。

3. 数据变化的过程

假设有以下代码:

data: {
  message: 'Hello Vue!'
}
  1. 当 Vue 初始化时,message 属性会被 Object.defineProperty 封装,变成具有 getter 和 setter 的属性。
  2. 组件渲染时,会访问 message 属性,触发 getter,并将当前的 Watcher(即组件)注册为依赖。
  3. 如果在之后修改 message(例如:this.message = 'Hello World!'),setter 被触发,Vue 会通过 Watcher 通知相关的组件重新渲染。

4. Vue 3 响应式原理(Proxy)

Vue 3 对响应式的实现做了改进,采用了 Proxy 来代替 Object.defineProperty,使得 Vue 更加高效,特别是在处理嵌套对象和数组时。

基本原理:

Vue 3 使用 Proxygetset 捕获器来代理对象的操作。Proxy 可以直接监听对象的所有操作,包括属性访问、修改、删除等。

const handler = {
  get(target, key, receiver) {
    // 访问属性时的逻辑
  },
  set(target, key, value, receiver) {
    // 修改属性时的逻辑
  }
}

const proxy = new Proxy(data, handler);

Vue 3 的响应式系统会创建一个 Proxy 对象,该对象代理原始数据,捕获对数据的读取和写入操作。这样 Vue 可以更加高效地进行依赖收集和数据更新。

5. 响应式实现的优缺点

优点:

  1. 自动化:无需手动管理视图和数据的同步,Vue 会自动处理数据变化和视图更新。
  2. 高效:通过 getter 和 setter 进行依赖收集,可以精确地追踪哪些视图依赖于哪些数据,只有相关的视图会在数据变化时更新。
  3. 灵活性:支持计算属性、侦听器等,使得开发者可以灵活控制数据的变化和视图更新的时机。

缺点:

  1. 性能开销:在大型应用中,过多的 gettersetter 可能会引入性能问题,特别是在复杂的数据结构和深层嵌套的对象中。
  2. 数组和对象的劫持:Vue 2 使用 Object.defineProperty 对数组元素和对象属性进行劫持时,有一些限制(例如,不能监听数组索引变化和数组长度的变化)。Vue 3 使用 Proxy 改进了这个问题。

总结

Vue 的响应式数据原理是通过 Object.defineProperty(Vue 2)或 Proxy(Vue 3)来实现的。这种机制通过劫持数据的 getter 和 setter,实现了视图和数据的双向绑定。当数据发生变化时,Vue 会通知所有依赖该数据的视图重新渲染,从而实现响应式更新。

标签:vue,视图,响应,Vue,原理,getter,setter,数据,属性
From: https://blog.csdn.net/HHX_01/article/details/144557690

相关文章

  • 如何在 Vue 中集成第三方身份认证服务?
    在Vue.js中集成第三方身份认证服务(如Google、Facebook或Twitter等)通常涉及以下几个步骤:选择认证服务:决定你要集成的第三方认证服务。常见的服务提供商有FirebaseAuthentication、Auth0、Okta等,它们提供了易于使用的SDK和API来处理用户认证。注册应用:......
  • 在 Vue 中实现拖拽排序功能的最佳方式。
    在Vue.js中实现拖拽排序功能,可以使用现成的库来简化开发过程。以下是几种推荐的方法:使用vuedraggable库:vuedraggable是一个基于Sortable.js的Vue组件,它提供了简单易用的API来创建可拖拽和排序的列表。这是最流行的选择之一。安装:npminstallvuedraggable......
  • vue电池电量组件
    代码<template><!--电池电量Icon组件--><divclass="electric-panel":class="bgClass"><divclass="panel":style="{transform:`rotate(${rotate}deg)`}"><d......
  • vue信号组件
    代码<template><divclass="signal-content"><divclass="signal-bars"><divv-for="(n,index)in5":key="n"class="bar":class="getBarClass(n)"......
  • vue多语言包i18n
    一、安装如果是vue2直接安装8.2.1版本,否则会出现版本不匹配的错误npminstallvue-i18n@8.2.1--save二、文件编辑在src目录下创建文件分别创建文件内容,内容为需要翻译的字段en.jsexportconsth={system:"Backgroundmanagementsystem",loginOut:"Lo......
  • Cadence学习笔记 6-7 电源_LED电路原理图绘制
    基于Cadence17.4,四层板4路HDMI电路更多Cadence学习笔记:Cadence学习笔记1原理图库绘制Cadence学习笔记2PCB封装绘制Cadence学习笔记3MCU主控原理图绘制​Cadence学习笔记4单片机原理图绘制​Cadence学习笔记5四路HDMI原理图绘制目录 6、电源电路原理图绘制7......
  • 半导体-OS测试原理概述
    01】开路/短路测试(也称为连续性测试或接触测试)验证在设备测试期间,是否已与DUT上的所有信号引脚建立了电气接触,并确保没有信号引脚与其他信号引脚或电源/地线短路。设备的成本与测试每个设备所需的时间直接相关。减少每个设备的平均测试时间的最佳方法之一是尽快排除有缺陷的......
  • 基于java的SpringBoot/SSM+Vue+uniapp的大学校园防疫与服务系统的详细设计和实现(源码
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • 《计算机组成原理》课 程 设 计 报 告
    题目:    RCLNR0与RCRNR0扩展指令设计 目录1、数据通路分析2、微程序控制器分析3、指令系统分析4、微程序控制器指令周期流程图5、微指令编码6、测试程序和运行结果7、心得体会1、数据通路分析AM2901是一个四位数的算术逻......
  • 视频去重原理及 Demo 示例
    视频去重是一个常见的需求,主要用于视频库或平台管理中,通过判断视频是否相同(或相似)来移除冗余内容。实现视频去重可以通过多种方法,具体选择取决于业务场景和性能要求。1.视频去重的原理1.1基本原理视频去重的核心在于计算视频的特征,然后比较这些特征以判断视频是否相同......