React中的虚拟DOM

211 阅读2分钟

React中的虚拟DOM

⭐虚拟DOM的创建

虚拟DOM有两种创建方式,一种是通过jsx,一种是通过js

通过jsx:

<!-- type中一定要写babel -->
<script type="text/babel">
        // 1.创建虚拟DOM
        const VDOM = <h1 id="vdom">Hello,React</h1> //这里不写引号,因为值不是字符串
        // 2.渲染虚拟DOM到页面
        ReactDOM.render(VDOM,document.getElementById('test'));
    </script>

通过js:

<script>
        // 1.创建虚拟DOM,这里使用React的createElement方法,参数:(标签, 属性, 值)
        const VDOM = React.createElement('h1',{id:'VDOM'},'Hello React');
        // 2.渲染虚拟DOM到页面
        ReactDOM.render(VDOM,document.getElementById('test'));
    </script>

既然jsx和js都能创建虚拟DOM,那我们为什么不用原生js,反而多此一举使用jsx呢?

JSX的优势

在上述创建单个虚拟DOM时看似两种方式差别不大,但如果要创建多层嵌套DOM呢?

例如:p标签中包裹一个span标签

使用jsx:

const VDOM = <p><span>Hello React</span></p>

一步到位!

为了看起来更加舒适,我们会写成如下格式,以括号包裹代表其为一个整体:

const VDOM = (
    <p>
        <span>Hello React</span>
    </p>
)

而如果使用js呢:

const VDOM = React.createElement('p',{},React.createElement('span',{},'Hello React'));

我们要在创建p标签时,内部再传入span标签作为其子标签,层层嵌套看得人眼花缭乱,所以我们在进行react开发时,都会使用jsx。

不过当babel将浏览器不能直接识别的jsx语法翻译为原生js时,最终代码仍是使用js的形式,使用jsx只是为了在开发维护人员看着更加舒适。

⭐虚拟DOM的本质

我们会创建虚拟DOM了,但它到底是什么呢?

我们来打印一下:

console.log(VDOM);

得到结果:VDOM就是一个Object

那么它和真实DOM有什么区别呢?

我们使用debugger查看一下

console.log(VDOM);
console.log(DOM);
debugger;

其中,VDOM是虚拟DOM,DOM是真实DOM,程序暂停后,我们将鼠标分别放到二者上面,会看到它们分别拥有的属性:

DOM的属性:

image.png

VDOM的属性:

image.png 很显然,VDOM虽然称作虚拟DOM,但它所含的属性并没有真实DOM那么多,所以我们常说虚拟DOM比较“轻”,便于操作,最终虚拟DOM需要经过React渲染才能成为真实DOM,出现在页面上。