码迷,mamicode.com
首页 > 其他好文 > 详细

虚拟DOM (virtual DOM)

时间:2020-04-03 23:30:09      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:bsp   ret   包含   递归   vnode   节点   head   操作   操作dom   

1、定义

虚拟dom就是一个简单的对象,包含标签名(tag)、属性(attr)、子元素(children),通过js操作virtual DOM,最终映射到真实的dom上。

2、为什么要用虚拟dom:

频繁地操作dom,会造成页面的回流和重绘,增加性能开销,降低页面的渲染速度。

把dom的操作放到js中,js运算速度快,提高效率;

跨平台优势,不依赖真实的环境,浏览器、node都可以实现。

3、虚拟dom在Vue中的应用:

vue.js通过编译将模板转换成渲染函数render,执行渲染函数就得到一个虚拟节点树,虚拟DOM与旧节点进行比对,记录之间的差异,只对发生变化的节点进行更新,最后返回真实的dom元素。

// patch 对比新旧节点(vnode、newVnode)
    function updateChildren(vnode,newVnode){
        var children=vnode.children||[];
        var newChildren=newVnode.children||[];
        children.forEach(function(childVnode,index){
            var newChildVnode=newChildren[index];
            if(childVnode.tag==newChildren.tag){
                //深层递归
                updateChildren(childVnode,newChildVnode)
            }else{
                //不一样则更新
                replaceNode(childVnode,newChildVnode)
            }
        });
    }


    //将Vnode渲染成真正的dom
    function createElement(vnode){
        var tag=vnode.tag;
        var attrs=vnode.attrs || {};
        var children=vnode.children || [];
        if(!tag)return null;
        //创建真实的dom元素
        var elem=document.createElement(tag);
        //属性
        var attrName
        for(attrName in attrs){if(attrs.hasOwnProperty(attrName)){
            //添加属性
            elem.setAttribute(attrName,attrs[attrs])
        }
        //子元素
        children.forEach(function(childVnode){
            //给elem添加子元素,若还有子节点,则递归生成子节点
            elem.appendChild(createElement(childVnode))
        });

        }
        //返回真实的dom元素
        return elem;
    }

 

 

虚拟DOM (virtual DOM)

标签:bsp   ret   包含   递归   vnode   节点   head   操作   操作dom   

原文地址:https://www.cnblogs.com/annie211/p/12629555.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!