初识React

React

是Facebook开源的一个用于构建用户界面的Javascript库,已经 应用于Facebook及旗下Instagram

React专注于MVC架构中的V,即视图

React引入了 虚拟DOM的概念:开发者操作虚拟DOM,React在必要的时候将它们渲染到真正的 DOM上

在引入React库之后,开发API就通过React对象暴露出来了,我们要做的就是

在虚拟DOM上创建元素,然后将它们渲染到真实DOM上

  • createElement(type,[props],[children...]) - 在虚拟DOM上创建指定的React元素

  type用来指定要创建的元素类型

  props是可选的JSON对象,用来指定元素的附加属性,比如样式、CSS类等

  children开始的所有参数,都被认为是这个元素的子元素

var el = React.createElement(
    "ul",
    null,
    React.createElement("li",null,"China"),
    React.createElement("li",null,"Japan"),
    React.createElement("li",null,"Korea")
);
  • render(element,container,[callback]) - 将虚拟DOM上的对象渲染到真实DOM上

  element是使用createElement()方法创建的React元素

  container是真实DOM中的HTML元素,作为渲染的目标容器

  callback参数是可选的函数,当渲染完成或更新后被执行

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>First</title>
    <!--1.引入React库-->
    <script src="lib/react.min.js"></script>
</head>
<body>
    <!--2.在真实DOM上定义容器-->
    <div id="content"></div>
    <script>   
        //3.在虚拟DOM上创建p元素
        var el = React.createElement(
          "ul",
          null,
          React.createElement("li",null,"aa"),
          React.createElement("li",null,"bb"),
          React.createElement("li",null,"cc")
        );
        //4.将虚拟DOM上的ul元素渲染到真实DOM上的#content容器
        React.render(el,document.querySelector("#content"));
    </script>
</body>
</html>

Web应用 中通常会在单页内有大量的DOM操作,而这些DOM操作很慢。React在每次需要渲染时,会先比较当前DOM内容和待渲染内容的差异, 然后再决定如何最优地更新DOM。提供了一种一致的开发方 式来开发服务端应用、Web应用和手机端应用。有了虚拟DOM这一层,所以通过配备不同的渲染器,就可以将虚拟DOM的内容 渲染到不同的平台。

React组件就是一个 实现预定义接口的JavaScript类:

React.createClass(meta)

meta是一个实现预定义接口的JavaScript对象

在meta中,至少需要实现一个render()方法,而这个方法, 必须而且只能返回一个有效的React元素

如果组件是由多个元素构成的,那么必须在外边包一个顶层 元素,然后返回这个顶层元素

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>LED Display</title>
    <script src="lib/react.min.js"></script>
    <!--组件样式-->
    <style>
        @font-face {
            font-family:"LED";
            src:url("font/LED.eot?") format("eot"),
                url("font/LED.woff") format("woff"),
                url("font/LED.ttf") format("truetype"),
                url("font/LED.svg#LED") format("svg");
            font-weight:normal;
            font-style:normal;
        }
        .ez-led{
            font-family : "LED";
            font-size : 40px;
            background : #70d355;
             500px;
            height:60px;
            display:block;
            line-height : 60px;
            text-align : right;
            padding : 10px;
            letter-spacing:5px;
            margin-top:20px;
        }
    </style>
</head>
<body>
    <!--定义容器-->
    <div id="content"></div>
    <script>
    //定义React组件
    var EzLedComp = React.createClass({
        //每个React组件都应该事先render()方法
        render : function(){
            var e = React.createElement(
                "div",
                null,
                React.createElement("div",{className : "ez-led"},"Hello, React111!"),
                React.createElement("div",{className : "ez-led"},"Hello, React222!")
            );
            //render()方法应该返回一个React元素
            return e;
        }
    });
    //创建React元素
    var el = React.createElement(EzLedComp);
    //渲染
    React.render(el,document.querySelector("#content"));
    </script>
</body>
</html>

React引入虚拟DOM以后,创建DOM树得在JavaScript里写代码,这使得界面定义 变得相当繁琐,于是JSX来了

JSX是对JavaScript语法的扩展,它让我们可以在JavaScript代码中以类似HTML 的方式创建React元素

  • 指定脚本类型
<script type="text/jsx">...</script>
//外部脚本
<script src="a.js" type="text/jsx"></script>
  • 引入JSX语法转换库
<script src="lib/JSXTransformer.js"></script>

示例

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>LED Display-in JSX</title>
    <!--引入React库-->
    <script src="lib/react.min.js"></script>
    <!--引入JSX转换库-->
    <script src="lib/JSXTransformer.js"></script>
    <!--组件样式-->
    <style>
        @font-face {
            font-family:"LED";
            src:url("font/LED.eot?") format("eot"),
                url("font/LED.woff") format("woff"),
                url("font/LED.ttf") format("truetype"),
                url("font/LED.svg#LED") format("svg");
            font-weight:normal;
            font-style:normal;
        }
        .ez-led{
            font-family : "LED";
            font-size : 40px;
            background : #70d355;
             300px;
            height:60px;
            line-height : 60px;
            text-align : right;
            padding : 10px;
            letter-spacing:5px;
        }
    </style>
</head>
<body>
    <!--定义容器-->
    <div id="content"></div>

    <!--声明脚本类型为JSX-->
    <script type="text/jsx">

        //定义React组件
        var EzLedComp = React.createClass({
            //每个React组件都应该事先render()方法
            render : function(){
                var e = 
                    //JSX--> 
                    <div>
                        <div className="ez-led">Hello, React!</div>
                        <div className="ez-led">1111111</div>
                        <div className="ez-led">2222222</div>
                    </div>;
                    //<--JSX
                return e;
            }
        });
        //渲染
        React.render(
            <EzLedComp/> , //JSX
            document.querySelector("#content"));  
    </script>
</body>
</html>

原文地址:https://www.cnblogs.com/baby123/p/5072756.html