- 初始化阶段可以使用的函数:
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已经被创建。
- 实例:查看触发顺序。
<!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>
- 各个实例的正确用法
<!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>
- 输出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>
react初始化阶段
时间: 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) 如无特