• 虚拟DOM (virtual 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;
        }

     

  • 相关阅读:
    JavaScript基础
    WordPress站点绑定多个域名
    linux下如何把php升级到5.6
    ansible shell 之运行后台程序
    Redhat7 开机启动服务
    模拟jenkins通过shell给ansible传入变量
    ansible-playbook权限提升多种方式
    ansible删除目录下所有内容
    ansible 文件和目录操作
    linux 用户和组管理
  • 原文地址:https://www.cnblogs.com/annie211/p/12629555.html
Copyright © 2020-2023  润新知