前几年入行前端的对Dom操作应该都不陌生,大量使用JQuery语法。
这几年框架的流行,可能会有很多人不太理解Dom的操作,本篇沉淀一下Dom的相关知识
HTML DOM
DOM是文档对象模型的简称(Documnet Object Model)
HTML页面以DOM树形式如下
Document是浏览器内置对象,通过Document可以获取并操作Dom。
获取DOM
getElementById
通过ID查找元素getElementsByTagName
通过标签名查找元素getElementsByClassName
通过类名查找元素querySelector
通过CSS选择器查找元素querySelectorAll
通过CSS选择器查找元素
修改DOM
document.write()
直接写入 HTML 输出流innerHTML
通过属性修改指定标签内容setAttribute
设置属性的方法attribute
改变属性
新建DOM
createElement
创建HTML元素,不会添加到DOM上,需要调用上述方法才能添加到DOm上removeChild
删除HTML元素appendChild
添加HTML元素replaceChild
替换 HTML 元素
上述方法都是操作DOM的方法,在Vue、React等框架出现之前,都是用jQuery操作dom,虽然比上面的简单一些,其实也是对上述方法的封装。
虚拟DOM
在Vue、React等框架出现以后,出现了虚拟DOM的概念,真实DOM是Document对象模型。那么虚拟DOM是什么呢?
首先虚拟DOM并非真实DOM,在Vue中虚拟DOM指VNode,包含tag、data、children...等属性。
Vnode部分源码
export default class VNode {
tag: string | void;
data: VNodeData | void;
children: ?Array<VNode>;
text: string | void;
elm: Node | void;
ns: string | void;
context: Component | void; // rendered in this component's scope
key: string | number | void;
componentOptions: VNodeComponentOptions | void;
componentInstance: Component | void; // component instance
parent: VNode | void; // component placeholder node
...
}
实际例子
// <div><p>1</p></div>
{
tag: '<div>',
children: [
{
tag: 'p',
text: '1'
}
]
}
通过属性嵌套形成类似顶部DOM数的结构。
在Vue之前,如果数据更新,一般做法是直接重新渲染指定区域的DOM,在Vue以后,出现了Diff算法,通过对比新的虚拟DOM和旧的虚拟DOM来更新部分节点,以节约性能。
关于虚拟DOM具体分析和diff过程本文不在描述,后续会对比Vue2和Vue3源码对比分析会进行详细分析
最后将虚拟DOM渲染到页面上还是文章顶部那些方法。