dom对比步骤

1.用js对象来表达dom结构

tagName 标签名
props 元素属性
key 唯一标识
children 子元素,格式和父元素一样
count 有几个子元素,用于计算当前元素的索引,处于整个dom中的第几个,方便dom操作

原js对象

{
"tagName": "div",
"props": {
"id": "container"
},
"children": [
{
"tagName": "h1",
"props": {
"style": "color:red"
},
"children": [
"simple virtual dom"
],
"count": 1
},
{
"tagName": "p",
"props": {},
"children": [
"hello world"
],
"count": 1
},
{
"tagName": "ul",
"props": {},
"children": [
{
"tagName": "li",
"props": {},
"children": [
"item #1"
],
"count": 1
},
{
"tagName": "li",
"props": {},
"children": [
"item #2"
],
"count": 1
}
],
"count": 4
}
],
"count": 9
}

2.原js对象渲染成dom结构

<div id="container">
<h1 style="color: red;">simple virtual dom</h1>
<p>hello world</p>
<ul>
<li>item #1</li>
<li>item #2</li>
</ul>
</div>

3.修改原js对象

{
"tagName": "div",
"props": {
"id": "container2"
},
"children": [
{
"tagName": "h5",
"props": {
"style": "color:red"
},
"children": [
"simple virtual dom"
],
"count": 1
},
{
"tagName": "p",
"props": {},
"children": [
"hello world2"
],
"count": 1
},
{
"tagName": "ul",
"props": {},
"children": [
{
"tagName": "li",
"props": {},
"children": [
"item #1"
],
"count": 1
},
{
"tagName": "li",
"props": {},
"children": [
"item #2"
],
"count": 1
},
{
"tagName": "li",
"props": {},
"children": [
"item #3"
],
"count": 1
}
],
"count": 6
}
],
"count": 11
}

4.对比哪些节点被修改
type 类型,0为标签名改变,1为子元素改变(删除或添加),2为属性改变,3为内容改变
key 对象第一层中key值表示索引,原dom中第几个元素发生变化

{
"0": [
{
"type": 2,
"props": {
"id": "container2"
}
}
],
"1": [
{
"type": 0,
"node": {
"tagName": "h5",
"props": {
"style": "color:red"
},
"children": [
"simple virtual dom"
],
"count": 1
}
}
],
"4": [
{
"type": 3,
"content": "hello world2"
}
],
"5": [
{
"type": 1,
"moves": [
{
"index": 2,
"item": {
"tagName": "li",
"props": {},
"children": [
"item #3"
],
"count": 1
},
"type": 1
}
]
}
]
}

5.渲染修改后的js对象

a.标签名改变,直接重新渲染整个元素,包括元素下的子元素
b.子元素改变,该删除的删除,该添加的添加(针对列表框架有一套自己的计算方法,可以自行百度去研究)
c.属性改变,操作对应元素的属性
d.内容改变,操作对应元素的内容

<div id="container2">
<h5 style="color: red;">simple virtual dom</h5>
<p>hello world2</p>
<ul>
<li>item #1</li>
<li>item #2</li>
<li>item #3</li>
</ul>
</div>

虚拟dom比对原理的更多相关文章

  1. 如何快速实现一个虚拟 DOM 系统

    虚拟 DOM 是目前主流前端框架的技术核心之一,本文阐述如何实现一个简单的虚拟 DOM 系统. 为什么需要虚拟 DOM? 虚拟 DOM 就是一棵由虚拟节点组成的树,这棵树展现了真实 DOM 的结构.这 ...

  2. [react] 什么是虚拟dom?虚拟dom比操作原生dom要快吗?虚拟dom是如何转变成真实dom并渲染到页面的?

    壹 ❀ 引 虚拟DOM(Virtual DOM)在前端领域也算是老生常谈的话题了,若你了解过vue或者react一定避不开这个话题,因此虚拟DOM也算是面试中常问的一个点,那么通过本文,你将了解到如下 ...

  3. JavaScript是如何工作的:编写自己的Web开发框架 + React及其虚拟DOM原理

    这是专门探索 JavaScript 及其所构建的组件的系列文章的第 19 篇. 如果你错过了前面的章节,可以在这里找到它们: JavaScript 是如何工作的:引擎,运行时和调用堆栈的概述! Jav ...

  4. 深入Vue2.x的虚拟DOM diff原理

    一.前言 Vue的核心是双向绑定和虚拟DOM(下文我们简称为vdom),关于双向绑定可以参阅木琴的文章<剖析Vue原理&实现双向绑定MVVM>,vdom是树状结构,其节点为vnod ...

  5. vue数据双向绑定的原理、虚拟dom的原理

    vue数据双向绑定的原理https://www.cnblogs.com/libin-1/p/6893712.html 虚拟dom的原理https://blog.csdn.net/u010692018/ ...

  6. 虚拟dom?diff算法?key?Vue原理的核心三问?打包教你搞定。

    为什么需要虚拟DOM 先介绍浏览器加载一个HTML文件需要做哪些事,帮助我们理解为什么我们需要虚拟DOM.webkit引擎的处理流程,如下图所示: 所有浏览器的引擎工作流程都差不多,如上图大致分5步: ...

  7. Vue原理--虚拟DOM

    为什么需要虚拟DOM? 如果对前端工作进行抽象的话,主要就是维护状态和更新视图,而更新视图和维护状态都需要DOM操作.其实近年来,前端的框架主要发展方向就是解放DOM操作的复杂性. 运行js的速度是很 ...

  8. vue虚拟dom原理

    Virual DOM是用JS对象记录一个dom节点的副本,当dom发生更改时候,先用虚拟dom进行diff,算出最小差异,然后再修改真实dom. vue的virtual dom的diff算法是基于sn ...

  9. React虚拟DOM浅析

    在Web开发中,需要将数据的变化实时反映到UI上,这时就需要对DOM进行操作,但是复杂或频繁的DOM操作通常是性能瓶颈产生的原因,为此,React引入了虚拟DOM(Virtual DOM)的机制. 什 ...

随机推荐

  1. Hbase和Hadoop的内存参数调优 + 前端控制台

    1.hadoop的内存配置调优 mapred-site.xml的内存调整 <property> <name>mapreduce.map.memory.mb</name&g ...

  2. layui 第三方组件 eleTree 树组件 树形选择器

    使用 JS位置 ,layui/lay/modules/eleTree.js:CSS位置 ,layui/css/modules/eleTree/eleTree.css: ## 下面应用即可页面css引用 ...

  3. Centos7 安装python3.8和pip

    安装python3 yum -y install yum-utilsyum-builddep pythoncurl -O https://www.python.org/ftp/python/3.8.0 ...

  4. 学习笔记:CentOS7学习之十四:linux文件系统

    目录 1. 机械硬盘结构 1.1 机械硬盘结构 1.2 簇和block 2.文件系统结构 2.1 文件名 2.2 inode的内容 2.3 inode的大小 2.4 目录文件 2.5 block块大小 ...

  5. 14.Sqoop把数据从HDFS导出到mysql

    创建数据文件 ,gopal,manager,,TP ,manisha,preader,,TP ,kalil,php dev,,AC ,prasanth,php dev,,AC ,kranthi,adm ...

  6. Spring Cloud Feign接口返回流

    身无彩凤双飞翼,心有灵犀一点通. 服务提供者 @GetMapping("/{id}") public void queryJobInfoLogDetail(@PathVariabl ...

  7. windows 的文件夹映射实现

    具体的操作命令如下:MKLINK [[/D] | [/H] | [/J]] Link Target/D:创建目录符号链接.默认为文件符号链接./H:创建硬链接,而不是符号链接./J:创建目录联接.Li ...

  8. 移动站Web开发图片自适应两种常见情况解决方案

    本文主要说的是Web中图片根据手机屏幕大小自适应居中显示,图片自适应两种常见情况解决方案.开始吧 在做配合手机客户端的Web wap页面时,发现文章对图片显示的需求有两种特别重要的情况,一是对于图集, ...

  9. JS基础_对象字面量

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. JS基础_if练习一

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...