Vue原理「十二」-- vdom和diff算法 *****

虚拟DOM(Virtual DOM) *****

vdom是实现vue和React的重要基石
diff算法是vdom中最核心、最关键的部分

1. 背景

DOM操作非常耗费性能
以前用jquery,可以行控制DOM操作的时机,手动调整
vue和React都是 数据驱动视图,如何有效控制DOM操作?

2. 数据驱动视图 解决方案 - vdom
  • 有一定复杂度,想减少计算次数比较难
  • 能不能把计算更多的转为JS,因为JS执行速度很快
  • vdom - 避免频繁操作DOM,用JS模拟 DOM 结构,计算出最小的变更,操作 DOM
3.用JS模拟ODM结构
<div id="div1" class="container">
  <p>vdom</p>
  <ul style="font-size:20px">
    <li>a</li>
  </ul>
</div>
<script>
  var a = {
    tag: 'div',
    props: {
      id: 'div1',
      className: 'container'
    },
    children: [{
      tag: 'p',
      children: 'vdom'
    }, {
      tag: 'ul',
      props: {
        style: 'font-size:20px'
      },
      children:[
        {
          tag: 'div',
          children: 'vdom'
        }
      ]
    }]
  }
</script>
4.通过snabbdom学习vdom

简介强大的vdom库,易学易用
Vue参考它实现的vdom和diff
Vue3.0重写了vdom的代码,优化了性能,但是vdom基本理念不变

snabbdom使用

	var container = document.getElementById('container') //定义容器
	var vnode=h(...) //定义虚拟DDM
	patch(container,vnode) //把虚拟DOM渲染到真实DDM上
	var newVnode=h(...) //定义新虚拟DDM
	patch(vnode,newVnode) //更新DDM
	patch(newVnode,null) //销毁DDM

snabbdom重点:

  • h函数: 定义并返回 虚拟DDM-vnode
  • patch函数 :把虚拟DOM渲染到真实DDM上;更新DDM:销毁DDM
  • vnode数据结构
5.vdom总结
用JS模拟ODM结构
新旧vnode对比,得出最小更新范围,最后更新DOM (snabbdom使用)
只有这样才能在 数据驱动视图模式下,有效控制DOM操作 (意义)

diff 算法概述 ***

diff即对比,是一个广泛的概念,如linux diff、git diff
两个JS对象也可以做diff
两颗树做diff,如vdom diff

1.树diff 时间负责度是o(n^3)

第一,遍历tree1;第二,遍历tree2
第三,排序
1000个节点,要计算 1亿次,算法不可用

2.优化时间复杂度到o(n)

之比较同一级,不跨级比较
tag不相同,则直接删掉重建,不再深度比较
tag和key两者都相同,则认为是相同节点,不再深度比较
在这里插入图片描述
在这里插入图片描述

patchVnode()

3.diff算法总结

patchVnode 逻辑
addVnodes、removeVnodes (使用情况)

updateChildren(key的重要性)
不使用key VS 使用key
不使用key:如果节点顺序变了,节点更新时需要全部删掉,
使用key:可以算出哪个key是相同的,可以直接移动

4.vdom和diff总结

updateChildren的过程不要深究,要知道大概过程
vdom核心概念:
h(传入的什么)
vnode(结构)
patch(作用、参数)
diff(过程、性能优化做了哪些改变、)
key(key的重要性)
vdom 存在的价值更加重要:基于数据驱动视图,控制dom操作

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值