「面试必看」Vue百题斩~ Vue数据响应式原理的四个核心模块

news2024/9/25 1:16:30

vue 响应式原理的四个核心模块

Observe

Observe 要实现的目标非常简单,就是把一个普通对象转换成响应式对象。

为了实现这一点,Observe 把对象的每个属性通过 Object.defineProperty 转换为带有 settergetter 的属性,这样一来,vue就有机会在设置和访问属性的时候做点别的事情。
在这里插入图片描述

Observe 是Vue内部的构造器,我们可以通过Vue提供的静态方法Vue.observe(object)间接的使用该功能。

在组件的生命周期中,这件事发生在beforeCreate之后,create之前。
具体的实现上,它会递归遍历对象中的所有属性,以完成深度的属性转换

由于遍历时只能遍历到对象的当前属性,无法检测到将来对象动态增加或删除属性的属性,因此Vue提供了$set$delete实例方法,让开发者通过这两个实例方法对已有响应式对象添加或删除属性。

对于数组,Vue会更改它的隐式原型,目的是因为Vue需要监听那些可能改变数组内容的方法。

在这里插入图片描述

总之,Observe的目的,就是要让一个对象。它属性的读取、赋值,内部数组的变化都要能够被Vue监听到。

Dep

这里有两个问题,就是读取属性的时候做什么事,属性变化的时候要做什么事,这个问题需要依靠Dep来解决。
Dep的意思是dependency,表示依赖的意思。

Vue会为响应式对象中的每个属性、对象本身、数组本身创建一个Dep实例,每个Dep实例都有能力做以下两件事情:

  • 记录依赖:是谁要用我
  • 派发更新:我改变了,我要通知那些用到我的人

当读取响应式对象的某个属性时,它会进行依赖收集:有人用到我了;当改变某个属性时,它会派发更新:那些用到我的人听好了,我变了,要更新。

在这里插入图片描述

Watcher

这里又出现一个问题,就是Dep如何知道谁在用我?

要解决这个问题,需要依靠另外一个东西,就是Watcher
当某个函数执行的时候,用到了响应式数据,响应式数据是无法知道是哪个函数在用自己的,因此,Vue通过一个巧妙的方法来解决这个问题。

我们不要直接执行函数,而是把函数交给一个Watcher对象去执行,Watcher是一个对象,每个这样的函数执行时都应该创建一个Watcher对象,通过Watcher去执行。

watcher会设置一个全局变量,让全局变量记录当前负责执行的watcher等于自己,然后再去执行函数,当函数执行时,使用到了响应式的数据,发生了依赖记录dep.depend(),那么dep就把这个全局变量记录下来,表示有一个watcher用到了我的属性。
Dep进行派发时,它会通知之前记录的所有watcher,我变化了!

在这里插入图片描述

每一个Vue组件都至少对应一个watcher,该watcher记录了该组件的render函数。
watcher首先会把render函数执行一遍收集依赖,于是那些在render中使用到的响应式数据就会记录这个watcher
当数据变化时,dep就会通知该watcher,而watcher将重新运行render函数,从而让界面重新渲染同时重新记录当前的依赖。

Scheduler

现在还剩下随后一个问题,就是Dep通知watcher执行运行对应的函数,就有可能造成函数频繁运行,从而导致效率低下。

例如,如果一个交给watcher的函数,里面用到了a,b,c,d,那么a,b,c,d四个属性都会记录依赖,于是下面的代码将触发四次watcher,更新四次:

this.a = 'new a';
this.b = 'new b';
this.c = 'new c';
this.d = 'new d';

这样显然是不合适的,因此,watcher收到派发更新的通知后,不是立即执行函数的,而是把自己交给一个叫调度器的东西。

调度器维护一个执行队列,该队列同一个watcher只会存在一次,他会同个一个nextTick的工具方法,把这些需要执行的watcher放入到事件循环的微队列中,nextTick的具体做法是通过promise完成的。

nextTick通过this.$nextTick暴露给开发者;

也就是说,当响应式数据变化时,render函数的执行是异步的,并且在微队列中。

总体流程

在这里插入图片描述

上一篇: 「面试必看」JS百题斩~ 终于明白了原型 与 原型链

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1981620.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

重头开始嵌入式第十二天(预处理和指针)

预处理 在 C 语言中,预处理是指在编译之前由预处理器对源代码进行的一些处理操作。 主要包括以下几个方面: 1. 宏定义:使用 #define 指令定义一个标识符来代表一个常量值、表达式或一段代码。 例如: #define PI 3.14159 2.…

亚马逊澳大利亚站 带绳窗帘认证步骤

带绳窗帘是一种室内用窗帘,可通过一根吊绳控制升降。此类商品包括但不限于蜂窝帘、水平百叶帘、百褶帘、卷式百叶帘、卷帘、透光帘、罗马帘、帘杆(包括使用帘杆的商品,如带帘杆的窗帘和布帘)、面板轨道和垂直百叶帘。 我们的带绳窗…

vue 开发工具 Hbuilder 简介及应用

一、简介 HBuilderX 是一款流行的前端开发工具,由DCloud公司开发。它支持多种编程语言,如HTML、CSS、JavaScript、Vue、UniApp等,非常适合用来开发Web应用、移动端应用和跨平台应用。 官网地址:https://www.dcloud.io/hbuilderx.…

ShardingSphere 内核工作原理

文章目录 内核工作原理配置管控SQL Parser: SQL解析引擎SQL Router- SQL 路由引擎SQL Rewriter : SQL 优化引擎SQL Executor : SQL执行引擎Result Merger: 结果归并 内核工作原理 ShardingSphere的整体架构图是这样的: 配置管控 在进入Shar…

火车站NTP电子钟,自动授时,保证时间精准

在现代交通体系中,火车站作为重要的交通枢纽,每天承载着大量乘客的出行需求。为了确保列车运行的准时性和乘客信息的准确性,火车站NTP电子钟成为不可或缺的一部分。本文将详细介绍火车站NTP电子钟的特点及其在不同场景中的应用优势。 一、火车…

【STL】String的底层构造

1.String类对象的构造&#xff08;后面有每一个接口的实现&#xff09; #define _CRT_SECURE_NO_WARNINGS 1 #pragma once #include<iostream> #include<assert.h> using namespace std;namespace bit {class string{public:typedef char* iterator;typedef const…

字节实习面试

1.比左边的数都小&#xff0c;比右边的数都大 public class Test3 {/*** 从左往右找当前位置往左最小的* 从右往左遍历找当前位置往右最大的* 比较* param args*/public static void main(String[] args) { // int[] arr new int[]{9,8,7,3,4,2,1};int[] arr new int[…

【第十届泰迪杯数据挖掘挑战赛A题害虫识别】-农田害虫检测识别-高精度完整更新

农田害虫检测识别项目-高精度完整版 一、说明&#xff1a; 该版本为基于泰迪杯完整害虫数据重新制作数据集、优化增强数据集、重新进行模型训练&#xff0c;达到高精度、高召回率的最优模型代码。包含论文、最优模型文件以及相关文件、原始数据集、训练数据集XML版、增强扩充…

五款超好用的报表软件推荐,其中一款竟然完全免费

与以往需要通过繁琐的数据表格和复杂的数字分析不同&#xff0c;可视化报表通过表格、图表和图形&#xff0c;将数据以更加直观的方式呈现出来&#xff0c;使得原本繁杂无序的数据变得清晰易懂。无论是管理层的决策分析&#xff0c;还是一线员工的日常工作&#xff0c;可视化报…

vs+qt一些问题

一直遇到的两个问题&#xff0c;今天解决了 1、 因为前后端分离&#xff0c;前端写完了&#xff0c;后端还在一直修改&#xff0c;但是每次都是单独打开的后端的sln&#xff0c;所以会出现这个&#xff0c;把前端的模块删掉就好了。 2、打开vs项目&#xff0c;很多报错&#…

怎么在视频上加文字?归纳了简单好用的方法

怎么在视频上加文字&#xff1f;在数字媒体制作中&#xff0c;为视频添加文字是一种常见的需求。无论是为了提供字幕、注释、标题还是视觉效果&#xff0c;文字元素都能增强视频的传达力和观赏性。因此&#xff0c;今天本文将介绍四种简单好用的方法&#xff0c;帮助你轻松地在…

硬盘数据恢复:所需时长、全面指南及注意事项

在数字化时代&#xff0c;硬盘作为我们存储重要数据的核心设备&#xff0c;其重要性不言而喻。然而&#xff0c;由于各种原因&#xff0c;如误删除、格式化、硬盘故障等&#xff0c;我们时常面临数据丢失的困境。数据恢复不仅关乎个人隐私和信息安全&#xff0c;更可能影响到我…

Platform Designer各模块(2)

1.On-Chip Memory&#xff08;存储器&#xff09; (RAM or ROM) Intel FPGA IP RAM&#xff1a;主存&#xff0c;与CPU直接交换数据的内部存储器&#xff0c;可读可写&#xff0c;断电不丢失数据&#xff1b; ROM&#xff1a;只能读取数据&#xff0c;断电丢失数据。 2.Syste…

如何利用matlab将现有的地基雷达回波数据调制为机载雷达回波数据???

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

Bug太多,苹果手机升级到18.1后怎么降级

最近苹果公司发布了iOS 18.1开发者测试版和macOS Sequoia 15.1的开发者测试版&#xff0c;此次发布的iOS18.1开发者测试版本苹果给其带来了两个重要的新功能。 1、通话录音功能 现在只要拨打或者是接听电话&#xff0c;界面左上角就会出现通话录音按键&#xff0c;点击即可开启…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第五篇 文件系统构建篇-第七十四章 buildroot构建文件系统

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

老照片修复软件分享3款!码住一些实用的方法!

在数字时代&#xff0c;老照片不仅是时间的印记&#xff0c;更是我们珍贵的记忆载体。然而&#xff0c;随着时间的流逝&#xff0c;这些照片往往会变得模糊、褪色甚至破损。幸运的是&#xff0c;现代科技的发展为我们提供了多种老照片修复软件&#xff0c;让我们能够轻松恢复这…

docker 发布geoserver服务添加字体

1. 创建容器时可直接挂载到系统字体库 2. 已发布的容器挂载字体目录 关闭docker服务 &#xff1a; systemctl stop docker.socket 修改config.v2.json :位置在 cd /var/lib/docker/containers/容器id 重新启动docker服务&#xff1a;systemctl start docker

【启明智显方案分享】6.86寸高清显示屏音频效果器解决方案

一、项目概述 本方案旨在设计一款集成6.86寸高清触摸显示屏的音频效果器&#xff0c;通过HMI&#xff08;Human-Machine Interface&#xff09;芯片Model 4驱动&#xff0c;实现高清晰度的视觉交互。该设备不仅支持音乐、麦克风及温响音量的精细控制&#xff0c;还内置丰富的预…

vue信息列表实现点击加载更多陆续显示后面数据

原理&#xff1a;在点击加载更多后进行判断&#xff1a; if (this.currentPage < this.totalPages - 1) {this.currentPage;} 如果当前页码小于总页码就让当前页码1&#xff0c;通过计算属性动态更新开始和结束值&#xff0c;从而当前页面展示更多数据&#xff1a; paginate…