React.js

 

react

  Facebook内部的一个javascript库,它引入了一种新的方试来操作DOM

 

  进行数据交互的时候,利用差异算法,不用整体更新DOM,只会更新有变化的DOM,极大的提高的性能

 

 

  官网访问:https://facebook.github.io/react/

 

  国外网站,速度一般比较慢,可以访问国内的网站:http://reactjs.cn/

 

  学习过程中,遇到任何问题都可以到这个论坛去留言:http://react-china.org/

 


1、特点

 

1、JSX语法

 

html结构与js可以混在一起写,更加清晰

 

2、虚拟DOM

 

通过DOM diff算法,只会更新有差异化的部分,不用渲染整个页面,从而提高效率

 

3、组件化

 

把页面上的功能都写个组件,然后可以结合起来,可以做到重用

 

 

2、安装

1、需要引入三个js文件

 

 

react.js 核心代码

 

react-dom.js 渲染DOM

 

browser.min.js 解析JSX语法

 

<head>
    <meta charset="UTF-8">
    <title></title>
    <script src="js/react.js"></script>
    <script src="js/react-dom.js"></script>
    <script src="js/browser.min.js"></script>
</head>

 

 

2、script标签的type类型一定要是text/babel

 

  (browser.min.js看到type为text/babel的script标签后,会把里面的内容解析成正常的js语法)

 

<script type="text/babel"></script>

 

 

3、js的代码依然要用/**/或者//注释,不能用html的注释,要不会报错 

 

/*ReactDOM.render(
    <ul>
        {
        colors.map(function(value,index){
            return <li>第{index}个是:{value}</li>
        })
        }
    </ul>,
    document.getElementById('box')
);*/

 

 

3、ReactDOM.render()方法  

 

React的最基本方法,将React的模板语法转为真正的HTML,并插入到指定的DOM节点里,再渲染它

 

参数1:创建的元素

 

参数2:要添加给谁(DOM元素)

 

参数3:渲染成功后的回调函数

 

<script type="text/babel">
    ReactDOM.render(
        <h1>kaivon</h1>,  //创建的元素
        document.getElementById('box'),//要添加给谁(DOM元素)  
        function(){
            console.log('渲染完成了');//渲染成功后的回调函数
        }
    );
</script>

 

 

4、JSX语法   JavaScript XML

概念

React的语法,它允许HTML与JavaScript混写,在html里可以写js

 

React不使用JSX的语法也可以工作,使用的话会提高组件的可读性,推荐使用JSX

 

特点

1、遇到尖括号开头的解析成html遇到大括号开头的解析成JavaScript

 

注意:大括号要解析成js代码,所以里面不要有分号

 

 

var colors=['red','green','blue'];
            
    ReactDOM.render(
        <ul>
            {
                colors.map(function(value,index){
                    return <li>第{index}个是:{value}</li>
                })    
            }
        </ul>,            //第一个参数
    document.getElementById('box')    //第二个参数
);

  

  2、可以在模板里插入变量,如果这个变量是个数组,则会自己把数组里所有数据全部显示

 

var arr=[
    <li>kaivon</li>,
    <li>陈学辉</li>,
    <li>356985332</li>
];
            
ReactDOM.render(
    <ul>{arr}</ul>,
    document.getElementById('box')
)

 

 

5、定义组件

  React中可以把每个功能都定义成组件,然后组件会像普通的html标签一样,插入到页面中

 

1、创建组件

React.createClass()

注意:

1、存组件的变量名首字母要大写

 

2、render的return里只能出现一个顶层标签

 

2、插入组件

把定义好的组件放在尖括号里,就形成了一个标签,就能以标签的形式插入到页面中

 

 插入方法:

 

1、<组件名/>这就是XML

 

2、<组件名></组件名>

 

<script type="text/babel">
    //创建组件
    var Person=React.createClass({
        render:function(){
          return (
              <div>
                  <h1>kaivon</h1>
                  <h2>陈学辉</h2>
                  <h3>18</h3>
              </div>
           )
         }
        });
            
    //添加组件,ReactDOM.render不仅可以输出html结构,还可以输出组件
    ReactDOM.render(
<Person/>, //这里可以写单标签,也可以写双标签

document.getElementById('box') ); </script

 

 

 

6组件属性

  props 它身上放的就是我们传进来的属性

 

插入组件的时候可以像html标签添加属性的方式一样,给组件传递数据

 

<script type="text/babel">
    var name='kaivon';
    var age=18;
    var sex='男';
            
    var Person=React.createClass({
        render:function(){
            return (
                <div>
                    <h1>{this.props.name}</h1>
                    <h2>{this.props.age}</h2>
                    <h3>{this.props.sex}</h3>
                </div>
            )
        }
    });
            
    ReactDOM.render(
        //<Person age='18'/>,
                
        <Person name={name} age={age} sex={sex}/>,
             //这里可以写单标签,也可以写双标签     
 
        document.getElementById('box')
    );
</script>        

 

 

 

7、组件子节点

 

  props对象的属性与组件的属性是一一对应的,但是有一个例外,props.children属性(组件的所有子节点)它的值不一定是一一对应的

  props.children的值有三种类型

1、undefined 当前组件没有子节点

 

2、object 当前组件只有一个子节点

 

3、array 当前组件有多个子节点

 

 

可以用

 

React.Children.map()来遍历子节点,不用担心它的类型是什么,都可以遍历出来

 

<script type="text/babel">
    var List=React.createClass({
        render:function(){
            return (
                <ul>
                    {
                    //console.log(this.props.children)
                   React.Children.map(this.props.children,function(child){
                            return <li>{child}</li>
                        })
                    }
                </ul>
            )
        }
    });
            
    ReactDOM.render(
        <List>
            <span>red</span>
            <span>green</span>
        </List>,
        document.getElementById('box')
    );
</script>

 

 

8、验证组件属性值的类型:

  组件的属性可以接受任意值,字符串、对象、函数等等都可以。有时,我们需要一种机制,验证别人使用组件时,提供的参数是否符合要求

 

只会提示警告,但是内容依然可以出来

 

<script type="text/babel">
    var person={
        name:'kaivon',
        age:18,
        sex:'男'
    }
            
    var Person=React.createClass({
        render:function(){
            return (
                <div>
                    <h1>{this.props.name}</h1>
                    <h2>{this.props.age}</h2>
                    <h3>{this.props.sex}</h3>
                </div>
            )
        },
        propTypes:{
            name:React.PropTypes.string,
            age:React.PropTypes.number,
            sex:React.PropTypes.string
        }
    });
            
    ReactDOM.render(
        <Person {...person} />,
        document.getElementById('box')
    );
</script>

 9、组件的状态

 

组件免不了要与用户互动,React的一大创新,就是将组件看成是一个状态机

 

  一开始有一个初始状态, 然后用户互动,导致状态变化,从而触发重新渲染UI 

 

 

 

getInitialState() 获取组件的状态

 

1、它必需写在创建组件的函数里

 

2、它必需有一个返回值是null或者对象

 

  state 获取状态对应的属性值(getInitialState方法的返回值)

 

   setState() 设置组件的状态

 

   它是组件身上的方法,组件是放在ReactDOM.render的返回值里

 

<script type="text/babel">
    var Status=React.createClass({
        getInitialState:function(){
            return {
                on:true,
                mes:'kaivon的第一种状态'    //数据
            }
        },
        render:function(){
            var style={
                //三目运算符 定义样式
                color:this.state.on?'red':'blue',
                        fontSize:this.state.on?'20px':'30px'
            }
            return (
                //添加到行间样式
                //style={style}结构里面想要执行js,需要添加大括号
                <h2 style={style}>{this.state.mes}</h2>
            )
        }
    });
     //渲染
     //声明一个变量接收render的返回值
   var component=ReactDOM.render(
        <Status/>,
        document.getElementById('box')
   );
   //console.log(component);
            
  component.setState({
       on:false,
       mes:'kaivon的第二种状态'
  });

</script>

 

 

 

 

posted @ 2017-10-16 21:34  shengnan_2017  阅读(475)  评论(0编辑  收藏  举报