react初始化阶段

  1. 初始化阶段可以使用的函数:
    getDefaultProps:只调用一次,实例之间共享引用。只有在组件的第一个实例被初始化的时候,才会调用他,然后react会把这个函数的返回结果保存起来,从第二个实例开始,他们的默认属性都是这同一个结果。实例之间共享引用,在js中有两种类型的数据,一种值类型,比如字符串,布尔值等,一种是引用类型,比如数组,对象等,如果函数返回的是引用类型的数据,那么react会把引用保存起来,在创建不同的实例的时候,他会使用同一个引用当做属性,但是我们知道,引用指向的都是同一个地址,所以说不同实例之间操作的其实是同一个数据,所以在用这个函数的时候,要注意返回的是引用还是值。

    getInitialState:初始化每个实例特有的状态。从这个函数开始,每个实例被初始化的时候,都会调用他, 不像第一个函数只会调用一次,第一个函数处理的是属性,第二个函数处理的是状态,由于状态是每个实例自己内部的信息,每个实例要维护自己状态,所以不同的实例有不同的状态,那么都需要调用这个函数。

    componentWillMount:render之前最后一次修改状态的机会。在这个时候,你还是可以修改状态的,但是在render里面就不可以在修改状态了。

    render:只能访问this.props和this.state,只有一个顶层组件,不允许修改状态和dom输出。this.props和this.state是render特有的两个数据源,除此以外,你不应该在获取其他的数据信息。只有一个顶层组件?render的返回值只能是一个组件,这个组件可以包含很多的子组件,也可以包含很多的子代码,但是本质上他还是一个组件,你不能返回一个数组。不允许修改状态和dom输出。如果一定要修改,也是可以的,但是react不推荐这么做,如果你修改了状态和输出的话,那么render函数就无法再服务端进行使用,当然我们大部分时候是在客户端使用的render函数,如果你想提高网站的加载性能,就可以在服务端进行处理,但是你的render函数需要修改状态和dom输出,在服务端得时候是没有这样的环境的,所以你如果修改了状态和输出,就只能在浏览器使用了,这回大大的限制你的系统性能。第二个原因就是你如果在render里面修改了状态和输出,会导致代码的逻辑变得非常的复杂,很难经过状态分析出结果,react设计目的之一就是让组件的逻辑变得清晰简单,这样就违背了这样的目的。你自己还是别人就很难看懂这段代码。

    componentDidMount:成功render并渲染完成真实dom之后触发,可以修改dom。这个函数被调用的时候,dom已经被创建。

  2. 实例:查看触发顺序。

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>测试</title>
    </head>
    <body>
        <script type="text/javascript" src="http://cdn.bootcss.com/react/0.13.2/react.min.js"></script>
        <script type="text/javascript" src="http://cdn.bootcss.com/react/0.13.2/JSXTransformer.js"></script>
        <script type="text/jsx">
            var style={
               color:"red",
               border:"1px solid #f99",
               width:"200px",
               height:"50px"
            };
            var HelloWorld=React.createClass({
               getDefaultProps: function(){
               console.log("getDefaultProps,1")
               },
               getInitialState: function(){
                  console.log("getInitialState,2");
                  return null;
               },
               componentWillMount: function(){
                  console.log("componentWillMount,3")
               },
               render: function(){
                   console.log("render,4")
                   return <p ref="childp">hello,{(
                      function(obj){
                      if(obj.props.name)
                        return obj.props.name
                       else
                        return "world"
                      }
                   )(this)}</p>
               },
               componentDidMount:function(){
                   console.log("componentDidMount,5");
               },
            });
            React.render(<div style={style}>HelloWorld</div>,document.body)
        </script>
    </body>
    </html>

    注意上面代码中红色的标记部分,我们只是输出的字符串HelloWorld,并不是标签<HelloWorld></Helloworld>,所以此时的控制台和输出是这样。

    我们可以看出,getDefaultProps在实际的使用中,是直接调用的,也就是在React.createClass之后,就会被调用并把结果存储起来,及时你没有生成实例,这个函数也会被调用,react这么做主要目的就是为了提高性能,尽可能早的将我们要做的事情处理好,这样当我们要使用HelloWorld实例的时候,就会省掉调用这个函数的时间从而提高性能。我们改一下代码,让其正确输出。

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>测试</title>
    </head>
    <body>
        <script type="text/javascript" src="http://cdn.bootcss.com/react/0.13.2/react.min.js"></script>
        <script type="text/javascript" src="http://cdn.bootcss.com/react/0.13.2/JSXTransformer.js"></script>
        <script type="text/jsx">
            var style={
               color:"red",
               border:"1px solid #f99",
               width:"200px",
               height:"50px"
            };
            var HelloWorld=React.createClass({
               getDefaultProps: function(){
               console.log("getDefaultProps,1")
               },
               getInitialState: function(){
                  console.log("getInitialState,2");
                  return null;
               },
               componentWillMount: function(){
                  console.log("componentWillMount,3")
               },
               render: function(){
                   console.log("render,4")
                   return <p ref="childp">hello,{(
                      function(obj){
                      if(obj.props.name)
                        return obj.props.name
                       else
                        return "world"
                      }
                   )(this)}</p>
               },
               componentDidMount:function(){
                   console.log("componentDidMount,5");
               },
            });
            React.render(<div style={style}><HelloWorld></HelloWorld></div>,document.body)
        </script>
    </body>
    </html>

  3. 各个实例的正确用法

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>测试</title>
    </head>
    <body>
        <script type="text/javascript" src="http://cdn.bootcss.com/jquery/2.0.3/jquery.min.js"></script>
        <script type="text/javascript" src="http://cdn.bootcss.com/react/0.13.2/react.min.js"></script>
        <script type="text/javascript" src="http://cdn.bootcss.com/react/0.13.2/JSXTransformer.js"></script>
        <script type="text/jsx">
           $(document).ready(
              function(){
                 var count=0;
                 var style={
                    color:"red",
                    border:"1px solid #090",
                 };
                 var HelloWorld=React.createClass({
                    getDefaultProps:function(){
                        console.log("getDefaultProps,1");
                        return{name:"Tom"};
                    },
                    getInitialState:function(){
                        console.log("getInitialState,2");
                        return{
                        myCount:count++,
                        ready:false
                        };
                    },
                    componentWillMount:function(){
                        console.log("componentWillMount,3");
                        this.setState({ready:true});
                    },
                    render:function(){
                         console.log("render,4");
                         return <p ref="childp">Hello,{
                             this.props.name ? this.props.name : "World"
                         }<br/>{""+this.state.ready}</p>;
                    },
                    componentDidMount:function(){
                         console.log("componentDidMount,5");
                         //这里才可以操作dom
                         $(React.findDOMNode(this)).append("surprise!");
                    },
                    //HelloWolrld内部
                 });
                 React.render(<div style={style}><HelloWorld></HelloWorld></div>,document.body)
                 //function 内部
              }
              //ready内部
           )
        </script>
    </body>
    </html>

  4. 输出count,生成多个HelloWorld

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>测试</title>
    </head>
    <body>
        <script type="text/javascript" src="http://cdn.bootcss.com/jquery/2.0.3/jquery.min.js"></script>
        <script type="text/javascript" src="http://cdn.bootcss.com/react/0.13.2/react.min.js"></script>
        <script type="text/javascript" src="http://cdn.bootcss.com/react/0.13.2/JSXTransformer.js"></script>
        <script type="text/jsx">
           $(document).ready(
              function(){
                 var count=0;
                 var style={
                    color:"red",
                    border:"1px solid #090",
                 };
                 var HelloWorld=React.createClass({
                    getDefaultProps:function(){
                        console.log("getDefaultProps,1");
                        return{name:"Tom"};
                    },
                    getInitialState:function(){
                        console.log("getInitialState,2");
                        return{
                        myCount:count++,
                        ready:false
                        };
                    },
                    componentWillMount:function(){
                        console.log("componentWillMount,3");
                        this.setState({ready:true});
                    },
                    render:function(){
                         console.log("render,4");
                         return <p ref="childp">Hello,{
                             this.props.name ? this.props.name : "World"
                         }<br/>{""+this.state.ready}{this.state.myCount}</p>;
                    },
                    componentDidMount:function(){
                         console.log("componentDidMount,5");
                         $(React.findDOMNode(this)).append("surprise!");
                    },
                    //HelloWolrld内部
                 });
                 React.render(<div style={style}><HelloWorld></HelloWorld><br/><HelloWorld></HelloWorld></div>
    
                     ,document.body)
                 //function 内部
              }
              //ready内部
           )
        </script>
    </body>
    </html>

时间: 2024-10-24 04:08:31

react初始化阶段的相关文章

React组件生命周期-初始化阶段的函数执行顺序

<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <script src="./react-0.13.2/build/react.js"></script> <sc

深入了解java虚拟机---类加载机制----初始化阶段

准备阶段是给变量赋系统的初始值.而初始化阶段就是给变量赋程序员自己设的值 初始化阶段是<clinit>()方法的执行过程.过程如下 1.编辑器收集所有的赋值动作和静态块合并形成<clinit>方法.收集是按照代码出现的顺序决定的.并且静态初始化块只能访问定义在之前的变量,对于在之后的变量可以赋值,但是不能访问 2.先执行父类的<clinit>方法,再执行本类的<clinit>方法.而且不需要显式调用,虚拟机会保证父类<clinit>方法先执行.虚

跟厂长学PHP7内核(五):一步步分析生命周期之模块初始化阶段

上篇我们讲到了模块初始化阶段,并得知它是由php_module_startup函数来实现的.该阶段的主要作用是初始化变量.常量:注册各种函数,比如工具.词法.语法函数等:解析配置文件:加载扩展:当然最重要的是计算出PHP二进制程序的路径,现在让我们来研究一下该函数都做了哪些工作. 1.sapi_initialize_request_empty函数 // main/SAPI.c SAPI_API void sapi_initialize_empty_request(void) { SG(serve

JVM 初始化阶段的重要意义分析

1.创建一个Mytest6类和Singleton类 public class MyTest6 { public static void main(String[] args) { Singleton singleton = Singleton.getInstance(); System.out.println("counter1:" +Singleton.counter1); System.out.println("counter2:" +Singleton.cou

深入理解JVM-类加载初始化阶段-类的主动与被动引用

JVM的类加载阶段中初始化阶段 P210 虚拟机规定的五种情况必须对类的“初始化”情况 1.遇到new.getstatic.putstatic.或invokestic 四条字节码指令时,如果类没有经过初始化,则需要先触发使其初始化,生成这四条指令的最常见的java代码场景时:使用new关键字实例化对象的时候.读取或设置一个类的静态字段(被final修饰,已在编译器把结果放入常量池的静态字段除外)的时候,以及调用一个类的静态方法的时候. 2.使用java.lang.reflect包的方法对类进行反

React组件生命周期-正确执行初始化阶段的函数

一. 二.代码 <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <script src="./jquery-2.1.4.min.js"></script> <sc

【前端】react学习阶段总结,学习react、react-router与redux的这些事儿

前言 借用阮一峰的一句话:真正学会 React 是一个漫长的过程. 这句话在我接触react深入以后,更有感触了.整个react体系都是全新的,最初做简单的应用,仅仅使用react-tools打包jsx时,我被react的函数式语法吸引,从而跳入这个圈子.一直到搭建webpack.react.react-router.redux架构,做了几个SPA项目,我还是感觉自己懂的太少,还在第一阶段徘徊,在这里暂时做一个阶段性总结,接下来将继续更深入了解react——不排除再转回vue.嘿嘿. 函数式组件

wifidog源码 - 初始化阶段

Wifidog是一个linux下开源的认证网关软件,它主要用于配合认证服务器实现无线路由器的认证放行功能. wifidog是一个后台的服务程序,可以通过wdctrl命令对wifidog主程序进行控制. 本文解释wifidog在启动阶段所做的初始化主要工作(代码片段1.1) 初始化配置(先将配置结构体初始化为默认值,在读取配置文件修改配置结构体)初始化已连接客户端列表(如果是通过wdctrl重启wifidog,将会读取之前wifidog的已连接客户端列表 代码片段1.2 代码片段1.3)如无特殊情

wifidog源码分析 - 初始化阶段

Wifidog是一个linux下开源的认证网关软件,它主要用于配合认证服务器实现无线路由器的认证放行功能. wifidog是一个后台的服务程序,可以通过wdctrl命令对wifidog主程序进行控制. 本文解释wifidog在启动阶段所做的初始化主要工作(代码片段1.1) 初始化配置(先将配置结构体初始化为默认值,在读取配置文件修改配置结构体) 初始化已连接客户端列表(如果是通过wdctrl重启wifidog,将会读取之前wifidog的已连接客户端列表 代码片段1.2 代码片段1.3) 如无特