vue diff算法与虚拟dom知识整理(7) 根据init.ts源码简单梳理patch都做了些什么

news2024/11/25 15:53:11

之前我们也见证了 diff算法 的强大 但他 只有确认是同一个节点才做对比 如果不是就直接暴力拆卸了

我们打开我们的案例 找到 node_modules 下面的snabbdom/src下面的 init.ts文件
在这里插入图片描述
init.ts 拉到最下面 我们就可以看到这个返回的patch函数
在这里插入图片描述
patch相比于他的功能 代码算比较少的了 因为 他里面调用了很多其他函数 就相当于他是一个中转站 将逻辑交给其他函数去处理

我们移下来 看到下图位置
在这里插入图片描述
这里 判断 如果第一个元素 是一个真实节点 而不是虚拟节点
那么 我们回忆一下 我们调用patch 什么时候第一个参数传一个真实节点
对 第一次渲染
我们第一次 第一个参数是渲染在什么节点上 第二个参数是个虚拟节点
从第二次开始才是传两个虚拟节点
在这里插入图片描述
然后 我们按住Ctrl 点到这个方法来看一下
在这里插入图片描述
这个方法比较简单说
就获取一下class id 然后第一个参数 或者一下参数的标签名 用来传选择器
然后调用vnode
vnode 函数 我们之后h函数的时候也讲过这个函数了 就是创建一个虚拟节点
简单说 这个函数的目的 就是将一个不同节点改成虚拟节点
在这里插入图片描述
这里 需要注意的是 TS语法函数 变量名后面 : 后代表参数的类型 而Element表示是一个节点 这是一个真正的DOM 节点 因为虚拟节点类型其实是一个对象
在这里插入图片描述
这一块代码 就是我们之前说的 只有确认为同一个虚拟节点 才进行精细化比较
在这里插入图片描述
这块 else中就是判断 不是同一个节点之后 暴力拆除的方法
直接createElm一个节点
然后removeVnodes掉老节点
在这里插入图片描述
然后 我们来捋一下流程 首先 进入patch 他会先判断 第一个节点是不是一个真实的节点
如果是虚拟节点就继续往下 如果是 真实节点 就将他转为虚拟节点
然后 再判断 第一和第二个参数是不是同一个虚拟节点 如果是 对两个参数精细化比较
如果不是 就直接暴力拆除然后插入新的节点
在这里插入图片描述
在整个过程中 最难的肯定就算这个精细化比较

首先 我们来搞清楚一个事 怎么判断两个参数 是不是同一个虚拟节点

init.ts中我们可以看到 是通过这里的sameVnode函数 判断的
在这里插入图片描述
我们按住Ctrl点进去

他在这里 就用这些属性通过 === 绝对等于进行比较 全部都一样 表示是同一个节点
其中 sel 选择器 就是 你是什么标签 这个要完全相同
判断两者 data中的 is 是否相同 这个对象的问号是TS中的操作符 表示 如果对象中有这个字段 就返回这个字段 如果没有 就返回 undefined
然后判断连个节点的key
这里 如果都没有 那就都是undefined 条件也算会成立的 但标签名选择器这个肯定是不会为空的

在这里插入图片描述
然后后面一个需要解释的就是 这个 如果不是相同节点 暴力拆除 然后插入新的
这里这个插入新的是个递归 我们需要看一下
按住Ctrl 我们点击这个createElm进去看一下
在这里插入图片描述
然后 这里面有个for循环
在这里插入图片描述
首先 想一下为什么要递归

先看会我们之前自己写的 index.js的这个地方
在这里插入图片描述
首先 经过刚才的整理 大家应该也明白这个container进入patch都会经历什么了 他其实不像大家理解的那样 变成虚拟节点的容器 而是他会被转为虚拟接单 然后被检查与第二个节点不一样 会被暴力拆掉 然后把第二个这个我们自己写的div虚拟节点换掉
这个是很多人会误解的地方

然后从上面的vonm这个虚拟节点 我们也就 明白了为什么要递归了 你不能值创建一层啊

就 我们创建完div 还要继续创建它下面的p啊
所以这个就有点麻烦

回到 init.ts 我们确认他的确是个递归 for中明显看到了它在自己调用自己
在这里插入图片描述
好 这样 我们就能把patch做的事大体梳一遍了 下一篇文章 我会和大家一起手写一个自己的 patch 函数

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

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

相关文章

LeetCode高频算法刷题记录1

文章目录 1. 无重复字符的最长子串【中等】1.1 题目描述1.2 解题思路1.3 代码实现 2. 反转链表【简单】2.1 题目描述2.2 解题思路2.3 代码实现 3. LRU 缓存【中等】3.1 题目描述3.2 解题思路3.3 代码实现 4. 数组中的第K个最大元素【中等】4.1 题目描述4.2 解题思路4.3 代码实现…

吴恩达OpenAI最新课程:prompt-engineering-for-developers读书笔记

文章目录 一、前言二、Prompt编写原则2.1 环境配置2.2 编写清晰、具体的指令2.2.1 使用分隔符2.2.2 结构化输出(JSON、HTML等)2.2.3 要求模型检查条件是否满足2.2.4 提供少量示例(Few-shot Prompting) 2.3 指导模型思考2.3.1 指定…

未来工业维护:探索数据分析与机器学习的融合之路

随着工业领域相关技术的不断发展,预测性维护作为一种先进的维护策略,正日益受到企业的重视。预测性维护的核心目标是通过准确预测设备故障的发生时间,实现及时维护和优化生产效率。而在实现这一目标的过程中,数据分析和机器学习的…

FreeRTOS:任务状态和信息查询

目录 一、任务相关 API函数预览二、任务相关API函数详解2.1uxTaskPriorityGet()2.2vTaskPrioritySet()2.3uxTaskGetSystemState() ※※※※※2.4vTaskGetInfo() ※※※※※2.5xTaskGetApplicationTaskTag()2.6xTaskGetCurrentTaskHandle()2.7xTaskGetHandle()2.8xTaskGetIdleTa…

教你用JMeter做接口测试的几个简单实例

目录 前言 1、登录(POST) 登录 2、获取学生信息(GET) 获取学生信息 3、添加学生信息(POST,JSON) 添加学生信息 4、学生充值金币(POST,Cookie) 学生金…

【Linux】11. 进程控制

小实验(谨慎测试) 1. 进程退出码的引出 2. 进程码的使用 3. 进程退出 3.1 进程退出情况 进程退出分三种情况: 1.代码运行完毕,结果正确 – return 0; 2.代码运行完毕,结果不正确 – 根据退出码判断错误情况 3.代码没有运行完毕,…

如何0基础自学黑客(网络安全)技术,万字长文教你如何学习黑客(网络安全)

一、自学网络安全学习的误区和陷阱 1.不要试图先成为一名程序员(以编程为基础的学习)再开始学习 我在之前的回答中,我都一再强调不要以编程为基础再开始学习网络安全,一般来说,学习编程不但学习周期长,而…

【数字化转型-06】数字化转型咨询项目中如何做好高层访谈

咨询项目中少不了至关重要的一步,那就是高层访谈,做好高层访谈,对于咨询项目至关重要,我们接触的维度越高,就会越能把控项目的真实意图,有的放矢,不会让下面的人带偏;另一方面我们也…

Vue3 使用 Ts 泛型 封装本地存储

前期回顾 NVM —— 你把我玩明白_彩色之外的博客-CSDN博客本文将学习 使用 NVM 管理node版本https://blog.csdn.net/m0_57904695/article/details/130670262?spm1001.2014.3001.5501 目录 新建 \src\utils\storage-utils.ts 使用 泛型示例 泛型交换变量 泛型 strin…

在Linux系统中用vim编写第一个C语言之gcc编译器

文章目录 在Linux系统中用vim编写第一个C语言HelloWorld第一步 创建第二步 编写第三步&#xff0c;编译第四步 运行 gcc四步骤gcc常用选项 在Linux系统中用vim编写第一个C语言HelloWorld 第一步 创建 vim HelloWorld.c第二步 编写 #include<stdio.h>int main(){printf(…

Android Jsoup爬取网页数据及其局限性,接口爬取数据的思路

1.Jsoup jsoup 是一款Java 的HTML解析器&#xff0c;可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API&#xff0c;可通过DOM&#xff0c;CSS以及类似于jQuery的操作方法来取出和操作数据。 需求是需要获取某个网站上的排行榜数据&#xff0c;用作App展示&am…

【axios】后端未收到前端post传参

今天遇到过问题&#xff0c;前端post请求参数明明已经传过去了&#xff0c;可是后端说没收到&#xff0c;不知道后端大哥是不是故意搞我。 代码前端图如下↓ 代码 import axios from axios //对象形式 const val {pass:123,user:name}axios.post(/api/login, val).then(res>…

Vue3-黑马(十三)

目录&#xff1a; &#xff08;1&#xff09;vue3-router-动态路由3 &#xff08;2&#xff09;vue3-进阶router-动态菜单 &#xff08;3&#xff09;vue3-进阶-router-令牌-获取用户信息 &#xff08;1&#xff09;vue3-router-动态路由3 登录页面后&#xff0c;如果点击了…

Android技术探索与实践:从新功能体验到故障调试的全方位探索

目录 Android技术探索与实践&#xff1a;从新功能体验到故障调试的全方位探索 第一章&#xff1a;技术解析 Android平台的架构和工作原理 应用组件的生命周期和交互方式 Android开发中常用的设计模式和技术框架解析 第二章:产品新功能体验测评 深入了解最新发布的Androi…

【安卓源码】Binder机制5 -- Java层Framework Binder机制和 AIDL

图中红色代表整个framework层 binder架构相关组件&#xff1b; Binder类代表Server端&#xff0c;BinderProxy类代码Client端&#xff1b;图中蓝色代表Native层Binder架构相关组件&#xff1b;上层framework层的Binder逻辑是建立在Native层架构基础之上的&#xff0c;核心逻辑都…

shell编程:概述、脚本入门、变量、运算符、条件判断、流程控制、读取控制台、函数、正则表达式、文本处理工具、综合案例

第 1 章 Shell 概述 1&#xff09;Linux 提供的 Shell 解析器有 [atguiguhadoop101 ~]$ cat /etc/shells /bin/sh /bin/bash /usr/bin/sh /usr/bin/bash /bin/tcsh /bin/csh2&#xff09;bash 和 sh 的关系 sh&#xff1a;比较基础bash&#xff1a;功能更加强大&#xff0c;默…

三十四、Hybrid 接口用法解析

文章目录 前言交换机接口类型有哪些Hybrid 端口使用场景什么时候必须使用 Hybrid 一、Hybrid 特点二、Hybrid 当做 access和trunk使用三、Hybrid 特殊用法 前言 交换机接口类型有哪些 Access、trunk、Hybrid、qinq Hybrid 端口使用场景 接pc、服务器、接交换机、接路由器&a…

Linux守护进程

"忍耐的灵魂啊&#xff0c;安静地运转吧~" 我们先来看看这个场景。这是一个常见的基于TCP套接字的网络服务器&#xff0c;服务端接收客户端发送的消息&#xff0c;收到后并向echo回响给客户端。 对于Linux而言&#xff0c;终端只能有一个前台进程&#xff0c;这也是为…

行业唯一丨冠珠出席“中国企业社会责任高峰论坛”,并荣获人民日报社“ESG年度案例”

践行社会责任&#xff0c;推动品牌高质量发展。5月11日&#xff0c;由人民日报社指导、人民日报社经济社会部主办的“中国企业社会责任高峰论坛”在上海盛大举行。 本次论坛围绕乡村振兴、共同富裕、绿色低碳等重点议题进行深入研讨&#xff0c;邀请国家发展和改革委员会、商务…

教程硬货|微信小程序开发之基于vue的微信开发工具JS文件解读(一)

文章目录 1 前言2 前期准备3 微信开发者工具3.1 创建项目3.2 页面介绍 4 读懂Pages4.1 index.wxss4.2 index.wxml4.3 index.json4.4 index.js 5 logs6 小程序的主要文件6.1 app.js6.2 app.json 7 讨论 1 前言 鉴于前段时间出的第一篇记录安装Nodejs和HBuilderX搭建、部署微信小…