博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
虚拟dom比对原理
阅读量:7135 次
发布时间:2019-06-28

本文共 3934 字,大约阅读时间需要 13 分钟。

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结构

simple virtual dom

hello world

  • item #1
  • item #2

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.内容改变,操作对应元素的内容
simple virtual dom

hello world2

  • item #1
  • item #2
  • item #3

虚拟dom比对原理图

转载地址:http://agvrl.baihongyu.com/

你可能感兴趣的文章
apache目录访问权限
查看>>
spring MVC配置详解
查看>>
function
查看>>
Easy ×××
查看>>
java-插补查找法
查看>>
PHP命令行参数详解及应用
查看>>
shell脚本作业
查看>>
公司腾讯企业邮箱服务器接口插件迁移的一个故障总结
查看>>
iOS11tableView适配问题
查看>>
快速排序
查看>>
DNS域名服务基础
查看>>
mysql开启慢查询日志及验证过程
查看>>
Python 循环 while,for语句
查看>>
微信头像透露你的性格,快看看你是哪一类
查看>>
搜索引擎指令介绍
查看>>
PPT利用设计模板ppt素材
查看>>
Ansible playbook
查看>>
我的友情链接
查看>>
Java程序员从笨鸟到菜鸟之(九十八)深入java虚拟机(七)深入源码看java类加载器ClassLoader...
查看>>
kickstart及引导镜像制作
查看>>