博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
虚拟DOM总结
阅读量:6230 次
发布时间:2019-06-21

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

什么是vdom? 为何会存在Vdom?

  1. 用 js 模拟 DOM 结构。
  2. DOM变化的对比放在js层来做。
  3. 提高重绘性能。

真实DOM:

  • item1
  • item2
复制代码

js模拟:

{    tag: 'ul',    attrs: {        id: 'list'    },    children: [        {            tag: 'li',            attrs: {
className: 'item'}, children: ['item1'] }, { tag: 'li', attrs: {
className: 'item'}, children: ['item2'] } ]}复制代码

举一个栗子:

设计一个数据表格,点击按钮更改数据。

dom 操作的写法:

    
Document
复制代码

vdom如何应用,核心API是什么?

  1. snabbdom介绍

  2. 核心api:

    h(),patch()

先看一个栗子:

    
Document
复制代码

改写上面dom处理的例子:

    
Document
复制代码

打开控制台观察下两种方法的DOM变化时的闪烁情况,第二种方法明显优于第一种方法,只修改了变化的部分。

diff算法

为何使用diff算法,一句话来说明的话:

因为DOM操作比较昂贵,想要减少DOM的操作就必须找出必要更新的节点,而找出的过程就称为----diff算法。

模拟 patch(container, vnode);

function createElement(vnode){    var tag = vnode.tag,        attrs = vnode.attrs || {},        children = vnode.children || []    if(!tag){        return null    }        var elem = document.createElement(tag);    for(var attr in attrs){        if(attrs.hasOwnProperty(attr)){            elem.setAttribute(attr, attrs[attr]);        }    }        children.forEach(function(children) {        elem.appendChild(createElement(children));    })        return elem}复制代码

模拟patch(vnode, newVnode)

function updateChildren(vnode, newVnode){    var children = vnode.children || [];    var newChildren = newVnode.children || [];    children.forEach(function(child, index){        var newChild = newChildren[index];        if(!newChild){            return false        }        if(child.tag === newChild.tag){            updateChildren(child, newChild)        }else{            replaceNode(child, newChild)        }    })}复制代码

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

你可能感兴趣的文章
nginx安装
查看>>
一个backup exec 2012的真实故障案例,服务无法启动1068
查看>>
我的友情链接
查看>>
Linux基础
查看>>
hadoop+hive环境搭建(centos6.5)-01
查看>>
点到点子接口的帧中继配置
查看>>
计算机网络与Internet应用
查看>>
python md5
查看>>
强制转换与内存
查看>>
发送UDP应答包的思考
查看>>
ASA防火墙基本配置
查看>>
软文真的可以帮助我们的网站吗?
查看>>
现代程序设计 作业6 - 简单而有意义的题目
查看>>
70、MSTP简介
查看>>
【VMware虚拟化解决方案】构建VMware私有云 实现ITaaS
查看>>
每天一个linux命令-mkdir
查看>>
四天精通shell编程(二)
查看>>
Linux 学习笔记_8_进程管理_2_进程管理命令
查看>>
python3中实现客户端与服务端交互发送文件
查看>>
Centos yum异常问题
查看>>