react的生命周期

React组件其实就是一个状态机,他接受两个输入参数,this.props和this.state,返回一个虚拟的DOM.

React组件的生命周期分几个阶段,每个阶段会有若干个回调函数可以响应不同的时刻。

     状态机就是  输入确定  输出一定确定。

生命周期的三个阶段,三者时间是不固定的,只是在逻辑上的分类。

--------初始化阶段:

     1. getDefaultProps:获取实例的默认属性(就是没有生成实例,组件的第一个实例呗初始化CreateClass的时候调用,,只调用一次)

                   var  Long = React.createClass({

                           render: function(){}

                       });

     在React组件中是有类和实例的区别的,通过React.createClass创建的是类  也就是说 Long 是一个类,在被一个回调getDefaultProps调用,这个函数会返回一个对象,这个对象会以引用的方式被所有的实例共享,  是引用。。。。

   当Reacat.createClass创建完类之后就可以进行实例化 ,,

     实例化一个类:::

      getlnitialState : 获取this.state的默认值

      componentWillMount: 在render之前调用此方法。在render之前需要做的事情就在这里处理。

      render : 渲染并返回一个虚拟的DOM

     componentDidMount:在render之后,react会使用render返回的虚拟DOM来创建真是的DOM完成之后调用。

其中需要之一的是::::

   1 this.state只存储原始数据,不要存储计算后的数据。

   2 componentWillMount用来处理render之前的逻辑,不能再render中处理业务逻辑。

      其实render就是一个模板的作用,他只是处理和展示相关的逻辑, 如果是业务逻辑,那么要放在componentWillMount中执行。

     所以在render中一定不会出现改变state之类的操作

   3 render 返回的是一个虚拟的DOM

       所谓的虚拟的DOM,其实就是ReactDOM的一个实例,他就是一个js对象。render方法完成之后。。。真是的DOM其实并不存在

   4 componentDidMount中处理和真是DOM相关的逻辑

     那么这个时候真实的DOM已经被渲染出来,可以通过this.getDOMNode()方法来使用了

    典型的场景就是在这里可以使用jquery插件


  三   更新  也就是运行中的状态

    当组件实例化完成,就会进入存在期,这个时候一般会响应用户操作和父组件的更新来更新组件

      componentWillRecieveProps: 父组件或者通过组件的实例调用setProps改变当前组件的props时调用

     shouldComponentUpdate:  是否需要更新 (可以返回false,接收数据后不更新,阻止render调用,后面的函数不会被继续执行)

     render : 只访问this.props和this.state;只有一个顶层组件,也就是说render返回只能是一个组件,不允许修改状态和DOM输出

    componentDidUpdate: 真实的DOM已经完成更新。

 四  销毁阶段

    componentWillUnmount: 开发者需要来销毁(组件真正删除之前调用,比如计时器和事件监听器)



   初始化阶段的测试:

   //注意这里的getInitialState返回的只能是obj或者null


    <!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <script type="text/javascript" src="https://github.com/es-shims/es5-shim/blob/master/es5-shim.js"></script>
    <script type="text/javascript" src="../build/react.js"></script>
    <script type="text/javascript" src="../build/react-dom.js"></script>
    <script type="text/javascript" src="../build/browser.min.js"></script>
<title>react初始化阶段的生命周期</title>
</head>
<body>
  <div id="app"></div>
    <script type="text/babel">
    var style = {
      color : "red",
      border : "1px red solid"
    };
    var TextClass = React.createClass({
         <!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <script type="text/javascript" src="https://github.com/es-shims/es5-shim/blob/master/es5-shim.js"></script>
    <script type="text/javascript" src="../build/react.js"></script>
    <script type="text/javascript" src="../build/react-dom.js"></script>
    <script type="text/javascript" src="../build/browser.min.js"></script>
<title>react初始化阶段的生命周期</title>
</head>
<body>
  <div id="app"></div>
    <script type="text/babel">
    var style = {
      color : "red",
      border : "1px red solid"
    };
    var TextClass = React.createClass({
         getInitialState : function(){
             console.log("getInitialState,2");
             return {}
          },


     getDefaultProps:function(){
            console.log("getDefaultProps,1");
          },
         
          componentWillMount:function(){
            console.log("componentWillMount,3");
          },
          render : function(){
            console.log("render ,4");
            return (<p>Hello {(function (obj){
               if(obj.props.name){ 
                     return obj.props.name
                }else{
                  return "long";
                }
            })(this)}</p>);
          },
          componentDidMount : function (){
             console.log("componentDidMount ,5");
          }
    });
        ReactDOM.render(
              <div style={style}><TextClass></TextClass></div>,
              document.getElementById("app")
           )
    </script>
</body>
</html> 



  运行中  

 <!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <!-- <script type="text/javascript" src="https://github.com/es-shims/es5-shim/blob/master/es5-shim.js"></script> -->
    <script type="text/javascript" src="../build/react.js"></script>
    <script type="text/javascript" src="../build/react-dom.js"></script>
    <script type="text/javascript" src="../build/browser.min.js"></script>
<title>react初始化阶段的生命周期</title>
</head>
<body>
  <div id="app"></div>
   <script type="text/babel">
      var style = {
         color : "red",
         border : "1px solid red"
      };
      var TextClass = React.createClass({
         componentWillReceiveProps : function(newProps){
            console.log("componentWillReceiveProps , 3");
            console.log(newProps);
         },
         shouldComponentUpdate : function(){
           console.log("shouldComponentUpdate , 4");
           return true
         },
         render : function(){
           console.log("render ,2");
           return (<p> hello {this.props.name ? this.props.name : "long"}</p>);
         },
         componentDidUpdate : function(){
           console.log("componentDidUpdate , 5");
         }
      });
      var TextSourceClass = React.createClass({
         getInitialState : function(){
          console.log("getInitialState ,1")
          return {name :''};
         },
         againChange : function(event){
               this.setState({name : event.target.value})
         },
         render : function(){
           return (
                  <div>
                  <TextClass name="this.state.name"></TextClass><br/>
                  <input type="text" onChange={this.againChange} />
                  </div>
             );
         }
      });
      ReactDOM.render(
             <div style={style}><TextSourceClass></TextSourceClass></div>,
             document.getElementById("app")
        )
   </script>
</body>
</html>

  销毁阶段

  <!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <script type="text/javascript" src="../build/react.js"></script>
    <script type="text/javascript" src="../build/react-dom.js"></script>
    <script type="text/javascript" src="../build/browser.min.js"></script>
<title>销毁阶段</title>
</head>
<body>
  <div id="app"></div>
   <script type="text/babel">
       var style = {
          color : "red",
          border : "1px solid red"
       };
       var TextClass = React.createClass({
          render : function(){
            console.log("render ,4");
            return (<p> hello : {this.props.name ? this.props.name : "long"}</p>);
          },
          componentDidUpdate :function(){
            console.log("componentDidUpdate");
          }
       });
       var TextSourceClass = React.createClass({
          getInitialState : function(){
           return {name:''}; 
          },
          againChange : function(name){
            this.setState({name : event.target.name});
          },
          render : function(){
           if(this.props.name == "1"){
            return <div>123</div>;
           }
           return (
                <div>
                <TextClass name={this.state.name}></TextClass><br/>
                <input type="text" οnchange={this.againChange} />
                </div>
             );
          }
       });
       ReactDOM.render(
          <div style={style}><TextSourceClass></TextSourceClass></div>,
          document.getElementById("app")
        )
   </script>
</body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值