react学习笔记——2. 虚拟dom

为什么使用jsx

虚拟dom的创建方式有两种,这里新加一个需求,要求虚拟dom包含id属性。

  • 通过jsx,也就是之前的方式,只不过初始化虚拟dom的时候需要加一个id属性。
  • 通过js,这种方式不需要babel,初始化时的代码如下,使用React的createElement方法
DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>2_使用js创建虚拟domtitle>
head>

<body>
    
    <div id="test">div>

    <script src="../js/react.development.js">script>
    <script src="../js/react-dom.development.js">script>

    <script>
        /**
         * 步骤:
         *      1、创建虚拟dom
         *      2、渲染虚拟dom到页面
        */
        // 1、创建虚拟dom,使用React的createElement方法进行创建,createElement有两个参数,第一个是标签名,第二个是标签属性,第三个是标签内容
        const VDOM = React.createElement('h1', { id: 'title' }, 'hello react')
        // 2、渲染虚拟dom,使用render方法,此方法有两个参数,一个是虚拟dom,第二个是容器,并且此方法是一个追加的过程
        ReactDOM.render(VDOM, document.getElementById("test"))
        /**
         * 注意,只有这里需要document,因为react不需要自己操作dom,这里只是一个demo
        */
    script>
body>

html>

但是如果要求在h1中不直接写hello react,而是加一个span标签。将hello react写在span中,则此时通过js实现时,第三个参数需要重新初始化一个虚拟标签span。则创建虚拟dom代码如下

const VDOM = React.createElement('h1', { id: 'title' }, React.createElement('span', {}, 'hello react'))

而通过jsx是非常容易的。因此,jsx只是为了解决一个问题,就是创建虚拟dom太繁琐了。并且,jsx在书写时,可以通过小括号将html代码括起来,从而将代码整理成html的结构形式,更加美观一些。代码如下

let VDOM = (
    <h1 id="title">
        <span>
            hello,react!
        span>
    h1>
)

其实babel就是将jsx转换成了js的形式,只不过这个代码不需要我们写,我们写的都是简单的代码。因此jsx就是js的语法糖,是js的一种简写方式。

虚拟dom是什么?

  • 本质就是Object对象(一般对象),可以通过console.log(VDOM)进行打印,可以通过console.log(typeof VDOM)查看类型,可以通过console.log(VDOM instanceof Object)进行判断
  • 与虚拟dom比较轻,有极少的属性。主要原始是虚拟dom是react内部使用,不需要想真实dom那么多的属性
  • 虚拟dom最终会被react转化为真实dom,呈现在页面上。
DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>3_虚拟dom与真实dom比较title>
head>

<body>
    
    <div id="test">div>
    <div id="demo">div>

    <script src="../js/react.development.js">script>
    <script src="../js/react-dom.development.js">script>
    <script src="../js/babel.min.js">script>
    <script type="text/babel">
        let VDOM = (
            <h1 id="title">
                <span>
                    hello,react!
                </span>
            </h1>
        )
        ReactDOM.render(VDOM, document.getElementById("test"))

        console.log("虚拟dom", VDOM)
        console.log("虚拟dom类型", typeof VDOM)
        console.log("虚拟dom与object比较", VDOM instanceof Object)
        console.log('------------')
        const TDOM = document.getElementById("demo")
        console.log("真实dom", TDOM)
        // 查看真实dom上的属性,可以通过debugger来查看
        debugger;

    script>
body>

html>

你可能感兴趣的:(react,react.js)