vue diff算法与虚拟dom知识整理(10) 梳理patch处理相同节点比较的基本逻辑

news2024/10/7 4:35:45

这次 我们来讲 diff算法处理到 当新旧节点 是同一个节点时的处理

我们之前也说过 如果不是同一个节点 他就会暴力拆旧 把新的插上去
但当他们是同一个节点 需要精细化比较 最做小化更新 这块我们还没有处理

打开我们的案例 打开 patch.js
在这里插入图片描述
对应其实就还是这一块还没有写

我们先将 src下的index.js改成这样

import h from "./snabbdom/h";
import patch from "./snabbdom/patch";

const container = document.getElementById("container");

const vnode = h("ul", {}, [
  h("li", {}, "1A"),
  h("li", {}, "2B"),
  h("li", {}, "3C")
]);

patch( container, vnode)

const btn = document.getElementById("btn");
const vnode1 = h("ul", {}, [
  h("li", {}, "1A"),
  h("li", {}, "2B"),
  h("li", {}, "3C"),
  h("li", {}, "4D")
]);

btn.onclick = function(){
  patch( vnode, vnode1)
}

可以看到 我们设置 通过getElementById获取btn 按钮 给他添加事件 当点击是通过patch更换虚拟dom节点 而我们更新前和更新后 其实只相差一个li标签
多了一个4D
我们运行项目
在这里插入图片描述
然后 我们点击更改dom
你会发现 没有任何反应 应该 我们也看到了 刚才 patch.js 中 判断为同一节点之后 里面是空的 没有任何逻辑
其实这个地方复杂也还是比较复杂的 因为情况比较多
例如 可能是新节点是文本 老节点有子节点 或者 老节点有文本 新节点是子节点 或者 都是文本 都是子节点
这个都是要考虑进去的 我们看看原文
打开 node_modules/snabbdom/src/init.ts

看到最下面的patch
他确认为同一节点 会调用 patchVnode 我们按住Ctrl 点击进入这个函数
在这里插入图片描述
他这个位置就在疯狂判断 新旧节点的文本和子节点
在这里插入图片描述
那么 首先 按上次的继续 判断他们为同一个节点
然后 进来先判断 两个节点是不是一模一样的 如果是 那就说明都不做了
如果不是 那就先判断 新节点内容是不是文字 如果进来 那就判断 老节点和新节点的文字是否相同 如果相同 那就还是 什么都不用做了 如果不相同 就将老节点的文本改为新节点的文本 这里 可能有人就会好奇 如果我新节点是文本 但老节点有子节点呢? 那好事啊 我们将文本写入节点要通过 innerText innerText写入内容的同时也会干掉它之前的节点

如果新节点 没有text文本属性 那就判断老节点 有没有子节点children属性
如果老节点没有children 那就直接清空老节点的内容 然后把新节点的children写进去

还有一种情况就说老节点有children 那么就要精细化去处理 两个节点的children 里面的内容了
处理children 深度的比较会麻烦一些这个我们可能要再单独去讲了 好啦 这里主要是个大家滤清思路
在这里插入图片描述

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

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

相关文章

PostgreSQL查询引擎——transform expressions之AEXPR_OP

static Node *transformAExprOp(ParseState *pstate, A_Expr *a){Node *lexpr a->lexpr; Node *rexpr a->rexpr; // 操作符左右表达式Node *result;/* Special-case "foo NULL" and "NULL foo" for compatibility with standards-broke…

Bug——后端返回LocalDateTime类型数据中间出现一个T

错误如下图所示: 返回的JSON格式数据里面会有一个多出来的T. 解决方案: 在后端的POJO层的实体类的LocalDateTime属性上面加上一个注解 JsonFormat(pattern"yyyy-MM-dd HH:mm:ss") 如下所示,然后在返回JSON格式数据时就不会出现那个多余的T了…

C++之模板初阶

目录 前言 1.泛型编程 2.模板 2.1 函数模板 2.1.1 函数模板概念 2.1.2 函数模板格式 2.1.3 函数模板的原理 2.1.4 函数模板的实例化 2.1.5 模板参数的匹配原则 2.2 类模板 2.2.1 类模板定义模式 2.2.2 类模板的实例化 前言 我们会不会有疑惑为什么C语言中&#xf…

Python学习笔记——cmeans模糊聚类例程

文章目录 模糊聚类应用简介安装环境demo:运行结果 模糊聚类应用简介 模糊聚类即通过模糊数学(处理模糊或不确定性信息的数学方法)的相关算法进行聚类分析任务。 常用的模糊聚类算法包括模糊C均值聚类(FCM,Fuzzy-c mea…

TryHackMe-Red Team Capstone Challenge (红队挑战)【真实红队模拟】

Red Team Capstone Challenge 注意:我不会在这里提及相关的flag,只专心打;flag可以自己用各个hostname尝试一遍 挑战作者的一句话 这个房间被评为坚硬,但因为它是你前面的一座山,它可能被评为疯狂。但是,…

【Vue3】滑动验证组件 | 滑动验证

前言 滑块验证不只判断是否滑动到尾部,真正的目的是检测用户行为,检测行为是人为、脚本、还是其它。 防止使用脚本大量注册、请求等 。比如发送请求时,判断用户在某个页面停留了多长时间。登录、注册时是否点击了登录、注册按钮,…

Lesson1——数据结构前言

前言: 今天我们正式开始一个新的专栏——初阶数据结构(C语言实现),本专栏后续持续更新时间复杂度空间复杂度、顺序表、链表、栈和队列、二叉树、排序等算法的相关知识,欢迎大家互相学习,可以私信互相讨论哦…

一次oracle环境 enq: TX - allocate ITL entry锁问题分析

enq: TX - allocate ITL entry锁问题分析 通过分析问题时间段两个节点的AWR报告,TOP1等待为锁竞争enq: TX - allocate ITL entry,该等待事件是由于缺省情况下创建的表的INITRANS参数为1,索引的INITRANS参数值为2.当有太多的并发DML操作的数据行处于相同的…

日志模块封封装:单例模式+策略模式+构建者模式+bugly

日志模块封封装:单例模式策略模式构建者模式bugly 一.单例模式策略模式构建者模式二.日志模块封装1.日志等级:LoggerLevel枚举类2.日志输出类型:LoggerType枚举类3.ILogger接口4.LogCatLogger/FileLogger/NetWorkLogger/EmailLogger5.使用构建者模式创建…

相同格式相同分辨率图片不同大小分析

1、问题 有三张图片,如下: 这三张图片均为jpg格式,分辨率均为1851*580,肉眼看不出区别。但是大小不同。 2号为217KB,4号为1.15MB,5号为1.06MB。 我们看下常规信息,先看2号: 可以…

初识Linux:第五篇

初识Linux:第五篇 初识Linux:第五篇1.Linux下的用户2.Linux权限管理2.1文件权限管理2.2文件权限的更改2.21改变文件访问权限属性2.22改变文件的身份 3.三个问题 总结 初识Linux:第五篇 😁本篇主要介绍Linux权限的相关知识&#x1…

vue+elementui+nodejs高校校园在线打印预约系统

在线提交文档进行打印 首页简单介绍系统 语言 node.js 框架:Express 前端:Vue.js 数据库:mysql 数据库工具:Navicat 开发软件:VScode 顶部或主页按钮转到打印 用户可以登录 查看历史打印记录 用户分学生和非学生 学生可以享有优惠…

基于.NetCore开源的Windows的GIF录屏工具

推荐一个Github上Start超过20K的超火、好用的屏幕截图转换为 GIF 动图开源项目。 项目简介 这是基于.Net Core WPF 开发的、开源项目,可将屏幕截图转为 GIF 动画。它的核心功能是能够简单、快速地截取整个屏幕或者选定区域,并将其转为 GIF动画&#x…

编写 ROS 消息发布订阅器(五)

执行命令,指定目录添加cpp文件 cd ~/catkin_ws/src/beginner_tutorials如果没有src目录, 就自己创建一个目录叫src cd src/ vim talker.cpp 复制代码粘贴: #include "ros/ros.h" #include "std_msgs/String.h" int m…

C++/R 期末冲刺3h

C 1. 基础程序 #include "iostream" // C头文件 #include "stdio.h" // C 头文件 //using namespace std; // 命名空间// main() 是程序开始执行的地方int main() {std::cout << "Hello, World!" << "\n";return 0; …

【数据结构】线性结构 之 顺序表

&#x1f331;博客主页&#xff1a;大寄一场. &#x1f331;系列专栏&#xff1a;数据结构与算法 &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 目录 前言 顺序表概念及结构 静态代码实现&#xff1a; 动态代码实现&#xff1a; SeqList.h文件 SeqLi…

使用VitePress和Github搭建个人博客网站,可以自动构建和发布

之前我们写过一篇关于如何自动构建和发布个人博客的文章&#xff0c;当时是使用VuePress和GitLab。GitLab持续集成部署CI/CD初探&#xff1a;如何自动构建和发布个人前端博客 现在换了Vue3和Vite&#xff0c;使用VitePress在Github上又搭建了一个博客。博客地址&#xff1a; …

博弈Ai官网ChatGPT能力真实测评

链接&#xff1a;https://chat.bo-e.com/&#xff08;基于ChatGPT4和3.5研发的智能聊天机器人国产镜像&#xff09; 一&#xff0c;博弈Ai的UI设计样式 1、博弈Ai&#xff08;ChatGPT&#xff09;白天模式 2、博弈Ai&#xff08;ChatGPT&#xff09;黑天模式 3、博弈Ai&#x…

五、c++学习(加餐1:汇编基础学习)

经过前面几节课的学习&#xff0c;我们在一些地方都会使用汇编来分析&#xff0c;我们学习汇编&#xff0c;只是学习一些基础&#xff0c;主要是在我们需要深入分析语法的时候&#xff0c;使用汇编分析&#xff0c;这样会让我们更熟悉c编译器和语法。 从这节课开始&#xff0c…

【003hive基础】hive的数据类型

文章目录 一.数据类型1. 基础数据类型2. 复杂数据类型 二. 显式转换与隐式转换三. hive的读时模式 一.数据类型 1. 基础数据类型 2. 复杂数据类型 array: 有序相同数据类型的集合。 arrays(1, 2)map : key必须是基本数据类型&#xff0c;value不限。 map(‘a’, 1, ‘b’, 2)s…