# React虚拟DOM的理解 `Virtual DOM`是一棵以`JavaScript`对象作为基础的树,每一个节点可以将其称为`VNode`,用对象属性来描述节点,实际上它是一层对真实`DOM`的抽象,最终可以通过渲染操作使这棵树映射到真实环境上,简单来说`Virtual DOM`就是一个`Js`对象,是更加轻量级的对`DOM`的描述,用以表示整个文档。 ## 概述 在浏览器中构建页面时需要使用`DOM`节点描述整个文档。 ```html

1

11
``` 如果使用`Js`对象去描述上述的节点以及文档,那么便类似于下面的样子。 ```javascript { type: "tag", tagName: "div", attr: { className: "root" name: "root" }, parent: null, children: [{ type: "tag", tagName: "p", attr: {}, parent: {} /* 父节点的引用 */, children: [{ type: "text", tagName: "text", parent: {} /* 父节点的引用 */, content: "1" }] },{ type: "tag", tagName: "div", attr: {}, parent: {} /* 父节点的引用 */, children: [{ type: "text", tagName: "text", parent: {} /* 父节点的引用 */, content: "11" }] }] } ``` ## React中的虚拟DOM `Virtual DOM`是一种编程概念,在这个概念里,`UI`以一种理想化的,或者说虚拟的表现形式被保存于内存中,并通过如`ReactDOM`等类库使之与真实的`DOM`同步,这一过程叫做协调。这种方式赋予了`React`声明式的`API`,您告诉`React`希望让`UI`是什么状态,`React`就确保`DOM`匹配该状态,这样可以从属性操作、事件处理和手动`DOM`更新这些在构建应用程序时必要的操作中解放出来。 与其将`Virtual DOM`视为一种技术,不如说它是一种模式,人们提到它时经常是要表达不同的东西。在`React`的世界里,术语`Virtual DOM`通常与`React`元素关联在一起,因为它们都是代表了用户界面的对象,而`React`也使用一个名为`fibers`的内部对象来存放组件树的附加信息,上述二者也被认为是`React`中`Virtual DOM` 实现的一部分。 ### React中的虚拟DOM的历史 在之前,`Facebook`是`PHP`大户,所以`React`最开始的灵感就来自于`PHP`。 在`2004`年这个时候,大家都还在用`PHP`的字符串拼接来开发网站。 ```php $str = ""; ``` 这种方式代码写出来不好看不说,还容易造成`XSS`等安全问题。应对方法是对用户的任何输入都进行转义`Escape`,但是如果对字符串进行多次转义,那么反转义的次数也必须是相同的,否则会无法得到原内容,如果又不小心把`HTML`标签给转义了,那么`HTML`标签会直接显示给用户,从而导致很差的用户体验。 到了`2010`年,为了更加高效的编码,同时也避免转义`HTML`标签的错误,`Facebook`开发了`XHP`。`XHP`是对`PHP`的语法拓展,它允许开发者直接在`PHP`中使用`HTML`标签,而不再使用字符串。 ```php $content =