JavaScript高级面试题(4)

本文探讨了虚拟DOM的概念,解释了为何使用虚拟DOM以提高重绘性能。详细介绍了虚拟DOM的实现,特别是Snabbdom库,包括其主要API h和patch函数的用法。此外,还阐述了将真实DOM转换为vnode的过程,以及diff算法在更新DOM中的作用。
摘要由CSDN通过智能技术生成

主要讲述虚拟DOM(virtual dom)

0.课程内容

vdom是什么?为何会存在vdom?
vdom的如何应用?核心API是什么?
介绍一下diff算法

1.什么是vdom

virtual dom,虚拟DOM
用JS模拟DOM结构
DOM变化的对比,放在JS层来做
提高重绘性能

什么是vdom,为何使用vdom

1.什么是vdom:

virtual dom,虚拟DOM
用JS模拟DOM结构
DOM变化的对比,放在JS层来做
提高重绘性能

普通DOM操作,看一个例子:

<ul id='list'>
	<li></li>
	<li></li>
</ul>

JS模拟DOM结构
在这里插入图片描述
如果item2删掉,如果不用虚拟DOm操作的话,可能要删掉ul和两个li,如果使用虚拟DOm,重新生成一个虚拟DOM文件,比对变化,改变原始的虚拟DOM文件。

2.设计一个需求场景

在这里插入图片描述

在这里插入图片描述
3.用jQuery实现

用Jquery实现:

//渲染函数
function render(data){

}

//修改信息
$('#btn-change').click(function(){
	data[1].age=30
	data[2].address = '深圳'
	render(data)
})

//初始化时候渲染
render(data)

render实现:

在这里插入图片描述

4.遇到的问题

DOM操作是昂贵的,JS运行效率高
尽量减少DOM操作,而不是推倒重来
项目越复杂,影响就越严重
vdom即可解决这个问题

2.使用vdom-snabbdom

推荐snabbdom两个教程:

https://www.jianshu.com/p/1f1ef915e83e
https://segmentfault.com/a/1190000017494569
https://segmentfault.com/a/1190000009017324

vdom是一个一类技术实现,snabbdom是实现vdom的一个库。

snabbdom,一个开源的vdom库,真实dom节点具有很多属性,而vdom具有几个attrs,属性减少了,体量非常小。

snabbdom主要API(h和patch函数):

在这里插入图片描述

h(模拟dom节点)
pacth(container,vnode)//container是真实DOM节点,vnode是虚拟对象
patch(vnode,newVnode) //
是snabbdom主要的API

h函数生成的vnode:
在这里插入图片描述
在这里插入图片描述

snabbdom源码解析

如果要我们自己实现一个虚拟dom,大概过程应该有一下三步:
1.compile,如何把真实DOM编译成vnode。
2.diff,我们要如何知道oldVnode和newVnode之间有什么变化。
3.patch, 如果把这些变化用打补丁的方式更新到真实dom上去。

1.snabbdom.js结构总览


src
├── helpers     
│   └── attachto.ts # 定义了AttachData,VNodeDataWithAttach ,VNodeWithAttachData 等数据结构
├── modules # 该文件夹中主要存放一些在更新dom差异的时候需要的操作     
│   ├── attributes.ts # 在vnode更新的时候,更新dom中的attrs操作。
│   ├── class.ts  # 在vnode更新的时候,更新dom中的class操作。
│   ├── dataset.ts # 在vnode更新的时候,更新dom中的dataset(自定义数据集)操作。
│   ├── eventlisteners.ts  # 在vnode更新的时候,更新dom中的eventlisteners(自定义数据集)操作。
│   ├── hero.ts # 在vnode更新的时候,和动画效果有关的支持
│   ├── module.ts # 定义的module结构
│   ├── props.ts # 在vnode更新的时候,更新dom中的props操作。
│   └── style.js # 在vnode更新的时候,更新dom中的style操作。
├── h.ts   # 帮助函数主要用来操作生成vnode的。
├── hooks.ts   # 定义snabbdom在运行的过程中hooks的模型。    
├── htmldomapi.ts # 对浏览器的dom的api进行二次包装,可以直接操作,html的dom的api。
├── is.ts # is函数主要是针对做一些数据类型判断,分 primitive和array类型。 
├── snabbdom.bundle.ts # snabbdom.ts、attributes、class、props、style 、eventListenersModule和h组成了这个ts文件。
├── snabbdom.ts # 主要文件,程序的主线逻辑都在这个文件里。
├── thunk.ts # thunk这个文件不知道干什么的,但是不影响理解主线逻辑。   
├── tovnode.ts   # 提供了toVNode的方法,把真实dom转化为vnode。
└── vnode.ts # 定义了vnode的模型和转化成为vnode的工具方法。 

从上面的代码结构,我们可以看到关于snabbdom.js中最主要的代码几个文件是h.ts,snabbdom.ts,tovnode.ts,vnode.ts。

vnode.ts:vnode是对DOM节点的抽象<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值