• 浅谈Vue虚拟dom树


    虚拟dom树,是可以在很大程度上减少由于我们频繁操作真实dom树而产生的性能消耗的

    在这里举一个简单的例子

    找到页面中的一个元素节点,将其innerHTML 中的num值,进行10000次操作,每次+1

            console.time("temp")  
            let myp = document.getElementById("myp")
            for(var i=0;i<10000;i++){
                let num = myp.innerHTML*1
                myp.innerHTML = ++num
            }
            console.timeEnd("temp")

    此时,我们可以通过多次执行,来得出,进行以上操作,大概需要40ms

    现在我们先将num进行10000次的+1,在内存中完成所有操作,然后一次性的将数值插入到真实dom树中

            console.time("temp")
            let myp = document.getElementById("myp")
            let num = 1  
            for(var i=0;i<10000;i++){
                num++
            }
            myp.innerHTML = num
            console.timeEnd("temp")

    此时,我们也可以通过多次执行,得出,大概需要0.3秒

    这样来看,操作真实dom树,会带来极大的性能消耗,所以有了虚拟dom树这个概念。

    下面来讲解一下Vue中对虚拟dom是的概念以及操作

    vue内部引入了虚拟dom概念 (js内存对象) 属于内存数据,真实dom的一层映射
     
      比如:网页中现有这么一组真实dom树
      
    <div id="content">
            <p>2</p>
            <ul class="list-group">
                jj
            </ul>
     </div>
      1.首先Vue在内存中生成一颗虚拟dom树
            var vDom = {
                tag:"div",
                attr:{
                    id:"content"
                },
                children:[
                    {tag:"p",content:"2"},
                    {tag:"ul",attr:{className:'list-group'}}
                ]
            }

       2.Vue将内存中的虚拟dom树进行初始化渲染,渲染成一颗真实dom树

      3.当我们修改Vue实例中的数据的时候

        this.arr.push("<li>11111</li><li>22222</li>")   
      
      4.Vue会将之前的虚拟dom树结合更新的数据生成一颗新的虚拟dom
            var newDom = {
                tag:"div",
                attr:{
                    id:"content"
                },
                children:[
                    {tag:"p",content:"2"},
                    {tag:"ul",attr:{className:'list-group'},children:[
                        {tag:"li",content:"11111"},
                        {tag:"li",content:"22222"}
                    ]}
                ]
            }

      

        5.将此次生成的新的虚拟dom与上一次的虚拟dom结构进行比对,对比差异(diff算法)

      6.对比的差异的部分进行重新的真实dom的渲染。

    这是Vue通过虚拟dom树操作来提高性能的一个方法,个人理解,可能会有出入,欢迎指正

     
  • 相关阅读:
    spark RDD操作的底层实现原理
    Spark累加器(Accumulator)陷阱及解决办法
    spark collect获取所有元素
    spark submit 入门
    pyspark使用ipython
    top k
    快速排序
    用 Spark 为 Elasticsearch 导入搜索数据
    静态成员变量不占用类的内存空间
    重载函数的调用匹配规则
  • 原文地址:https://www.cnblogs.com/Huskie-/p/13493784.html
Copyright © 2020-2023  润新知