React入门理解demo

1.React文档结构

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>React-demo1</title>
 6     <!-- 核心库 -->
 7     <script src="build/react.js"></script>
 8     <!-- 提供与dom相关功能 -->
 9     <script src="build/react-dom.js"></script>
10     <!-- 将jsx转化为js -->
11     <script src="build/browser.min.js"></script>
12 </head>
13 <body>
14     <div id="example"></div>
15     <!-- script的type="text/babel"必不可少,js与jsx不兼容 -->
16     <script type="text/babel">
17         //文档内容转自:http://www.ruanyifeng.com/blog/2015/03/react.html
18         //**our code goes here**
19         //ReactDOM.render是React最基本的语法,用于将模板转为html语言,并插入制定的DOM节点
20         ReactDOM.render(
21             <h1>Hello,world!</h1>,
22             document.getElementById("example")
23         )
24     </script>
25 </body>
26 </html>

2.ReactDOM.render()

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>react-demo2</title>
 6     <script src="build/react.js"></script>
 7     <script src="build/react-dom.js"></script>
 8     <script src="build/browser.min.js"></script>
 9 </head>
10 <body>
11     <div id="example"></div>
12     <script type="text/babel">
13     //map()方法一次对数组元素进行处理,map方法不会对空数组进行检测,map方法不会改变原数组
14         var names = ['Alice','Lily','Kate'];
15         ReactDOM.render(
16             <div>
17                 {names.map(function(name){
18                     return <div>hello,{name}!</div>
19                 })}
20             </div>,
21             document.getElementById('example')
22         )
23     </script>
24 </body>
25 </html>

3.JSX 语法

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>react-demo3</title>
 6     <script src="build/react.js"></script>
 7     <script src="build/react-dom.js"></script>
 8     <script src="build/browser.min.js"></script>
 9 </head>
10 <body>
11     <div id="example"></div>
12     <script type="text/babel">
13         var arr = [
14             <h1>Hello,world!</h1>,
15             <h2>React is awesome!</h2>
16         ];
17         ReactDOM.render(
18             <div>{arr}</div>,
19             document.getElementById('example')
20         )
21     </script>
22 </body>
23 </html>

4.组件

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>React-demo4</title>
 6     <script src="build/react.js"></script>
 7     <script src="build/react-dom.js"></script>
 8     <script src="build/browser.min.js"></script>
 9 </head>
10 <body>
11     <div id="example"></div>
12     <script type="text/babel">
13         //React允许将代码封装成组件,React.createClass()方法用于生成一个组件类
14         //注意,组件类的第一个字母必须大写,如HelloMessage
15         //组件的属性可以在组件类的this.props对象上读取,如组件的name属性读取:this.props.name
16         //属性注意:class属性要写成className,for属性要写成htmlFor,因为class和for都是js的保留字
17         //this.props对象的属性与组件的属性一一对应,例外的是this.props.children属性,它表示组件的所有子节点
18         //另外,组件内只能包含一个顶层标签
19         var HelloMessage = React.createClass({
20             render : function(){
21                 return <h1>hello,{this.props.name}</h1>
22             }
23         });
24         ReactDOM.render(
25             <HelloMessage name="John" />,
26             document.getElementById('example')
27         )
28     </script>
29 </body>
30 </html>

5.this.props.children

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>react-demo5</title>
 6     <script src="build/react.js"></script>
 7     <script src="build/react-dom.js"></script>
 8     <script src="build/browser.min.js"></script>
 9 </head>
10 <body>
11     <div id="example"></div>
12     <script type="text/babel">
13         //this.props.children的值可能有三种,如果当前组件没有子节点,就是undefined;如果当前组件有一个子节点,就是object;如果当前组件有多个子节点,就是Array.
14         //React提供了React.Children这个工具方法来处理this.props.Children,我们可以用React.Children.Map()来遍历子节点,而不用担心this.props.children的类型
15         var NotesList = React.createClass({
16             render : function(){
17                 return <ol>
18                     {
19                         React.Children.map(this.props.children,function(child){
20                             return <li>{child}</li>
21                         })
22                     }
23                 </ol>
24             }
25         });
26         ReactDOM.render(
27             <NotesList>
28                 <span>Hello</span>
29                 <span>World</span>
30             </NotesList>,
31             document.getElementById('example')
32         )
33     </script>
34 </body>
35 </html>

6.PropTypes

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>react-demo6</title>
 6     <script src="build/react.js"></script>
 7     <script src="build/react-dom.js"></script>
 8     <script src="build/browser.min.js"></script>
 9 </head>
10 <body>
11     <div id="example"></div>
12     <script type="text/babel">
13         //组件的属性,可以接受任意值,组件类的PropTypes属性可以验证实例的属性是否符合要求
14         //MyTitle组件有一个title属性,PropTypes告诉React这个title是必须的,并且要是string类型的
15         //当我们设置title的属性值为数值时,这一条验证就通不过,控制台就会报错
16         var MyTitle = React.createClass({
17             propTypes:{
18                 title:React.PropTypes.string.isRequired
19             },
20             render:function(){
21                 return <h1>{this.props.title}</h1>
22             }
23         }),
24             //data = 123;
25             data = 'hello world';
26         ReactDOM.render(
27             <MyTitle title={data}/>,
28             document.getElementById("example")
29         )
30     </script>
31 </body>
32 </html>

7.getDefaultProps用来设置组件的默认属性

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>react-demo7</title>
 6     <script src="build/react.js"></script>
 7     <script src="build/react-dom.js"></script>
 8     <script src="build/browser.min.js"></script>
 9 </head>
10 <body>
11     <div id="example"></div>
12     <script type="text/babel">
13         //getDefaultProps用来设置组件的默认属性
14         var MyTitle = React.createClass({
15             getDefaultProps:function(){
16                 return {
17                     title:'hello world!'
18                 };
19             },
20             render:function(){
21                 return <h1>{this.props.title}</h1>;
22             }
23         });
24         ReactDOM.render(
25             <MyTitle />,
26             document.getElementById('example')
27         )
28     </script>
29 </body>
30 </html>

8.获取真实的dom节点

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>react-demo8</title>
 6     <script src="build/react.js"></script>
 7     <script src="build/react-dom.js"></script>
 8     <script src="build/browser.min.js"></script>
 9 </head>
10 <body>
11     <div id="example"></div>
12     <script type="text/babel">
13         //获取真实的dom节点
14         //组件中的DOM并不是真实的dom,称为虚拟dom(virture dom),只有当它插入到文档中以后,才变成真实的dom
15         //MyComponent组件中有一个文本输入框,用于获取用户的输入,这时就必须获取真实的dom节点,虚拟dom是拿不到用户输入的。为了做到这一点,文本输入框必须有一个[ref]属性,然后this.refs.[refName]就会返回这个真实的节点
16         //注意:因为this.refs.[refName]获取到的是真实的dom节点,所以必须等到虚拟节点插入到文档中以后,才能使用这个属性,否则就会报错。
17         //上面代码中,通过为组件指定Click事件的回调函数,确保了只有等到真实dom发生click事件以后,才会读取this.refs.[refName]属性
18         //React除了支持click事件之外,也支持keyDown、copy、scroll等事件
19         
20         var MyComponent = React.createClass({
21             handleClick:function(){
22                 this.refs.myTextInput.focus();
23             },
24             render:function(){
25                 return (
26                     <div>
27                         <input type="text" ref="myTextInput" />
28                         <input type="button" value="Focus the Text input" onClick={this.handleClick} />
29                     </div>
30                 );
31             }
32         });
33         ReactDOM.render(
34             <MyComponent />,
35             document.getElementById("example")
36         )
37     </script>
38 </body>
39 </html>

9.this.state

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>react-demo9</title>
 6     <script src="build/react.js"></script>
 7     <script src="build/react-dom.js"></script>
 8     <script src="build/browser.min.js"></script>
 9 </head>
10 <body>
11     <div id="example"></div>
12     <script type="text/babel">
13         //组件免不了要与用户互动。React的一大创新,就是将组件看成一个状态机,一开始有一个初始状态,然后用户互动,导致状态变化,从而触发重新渲染UI。
14         //在组件LikeButton中,getInitialState方法用于定义初始状态,也就是一个对象,这个对象可以通过this.state读取。
15         //当用户点击组件,导致状态变化,this.setState方法就修改状态值,每次修改之后,就会自动调用this.render方法,再次渲染组件
16         //this.props与this.state都用于描述组价的特性,可能会产生混淆。一个简单的区分方法:this.props表示那些一旦定义,就不再改变的特性;而this.state是会随着用户互动而产生变化的特性
17         var LikeButton = React.createClass({
18             getInitialState:function(){
19                 return {liked:false};
20             },
21             handleClick:function(event){
22                 this.setState({liked:!this.state.liked});
23             },
24             render:function(){
25                 var text = this.state.liked?'like':'haven\'t liked';
26                 return (<p onClick={this.handleClick}>You {text} this.click to toggle</p>)
27             }
28         });
29         ReactDOM.render(
30             <LikeButton />,
31             document.getElementById("example")
32         )
33     </script>
34 </body>
35 </html>

10.表单

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>react-demo9</title>
 6     <script src="build/react.js"></script>
 7     <script src="build/react-dom.js"></script>
 8     <script src="build/browser.min.js"></script>
 9 </head>
10 <body>
11     <div id="example"></div>
12     <script type="text/babel">
13         //组件免不了要与用户互动。React的一大创新,就是将组件看成一个状态机,一开始有一个初始状态,然后用户互动,导致状态变化,从而触发重新渲染UI。
14         //在组件LikeButton中,getInitialState方法用于定义初始状态,也就是一个对象,这个对象可以通过this.state读取。
15         //当用户点击组件,导致状态变化,this.setState方法就修改状态值,每次修改之后,就会自动调用this.render方法,再次渲染组件
16         //this.props与this.state都用于描述组价的特性,可能会产生混淆。一个简单的区分方法:this.props表示那些一旦定义,就不再改变的特性;而this.state是会随着用户互动而产生变化的特性
17         var LikeButton = React.createClass({
18             getInitialState:function(){
19                 return {liked:false};
20             },
21             handleClick:function(event){
22                 this.setState({liked:!this.state.liked});
23             },
24             render:function(){
25                 var text = this.state.liked?'like':'haven\'t liked';
26                 return (<p onClick={this.handleClick}>You {text} this.click to toggle</p>)
27             }
28         });
29         ReactDOM.render(
30             <LikeButton />,
31             document.getElementById("example")
32         )
33     </script>
34 </body>
35 </html>

11.生命周期-componentDidMount方法

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>react-demo11</title>
 6     <script src="build/react.js"></script>
 7     <script src="build/react-dom.js"></script>
 8     <script src="build/browser.min.js"></script>
 9 </head>
10 <body>
11     <div id="example"></div>
12     <script type="text/babel">
13         //代码在Hello组件加载以后,通过componentDidMount方法设置一个定时器,每个100ms,就重新设置组件的透明度,从而引发重新渲染
14         //另外,组件的style属性不能写成style="opacity:{this.state.opacity};",而要写成style = {{opacity:this.state.opacity}}
15         var Hello = React.createClass({
16             getInitialState:function(){
17                 return {opacity:1.0};
18             },
19             componentDidMount:function(){
20                 this.timer = setInterval(function(){
21                     var opacity = this.state.opacity;
22                     opacity -= .05;
23                     if(opacity<0.1){
24                         opacity = 1.0;
25                     }
26                     this.setState({
27                         opacity:opacity
28                     });
29                 }.bind(this),100);
30             },
31             render:function(){
32                 return (
33                     <div style={{opacity:this.state.opacity}}>Hello{this.props.name}</div>
34                 )
35             }
36         });
37         ReactDOM.render(
38             <Hello name="world"/>,
39             document.getElementById("example")
40         )
41     </script>
42 </body>
43 </html>

12.Ajax请求

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>react-demo12</title>
 6     <script src="build/react.js"></script>
 7     <script src="build/react-dom.js"></script>
 8     <script src="build/browser.min.js"></script>
 9     <script src="build/jquery.min.js"></script>
10 </head>
11 <body>
12     <div id="example"></div>
13     <script type="text/babel">
14         //组件的数据来源,通常就是通过Ajax请求从服务器获取,可以使用componentDidMount方法设置Ajax请求,等到请求成功,再用this.setState方法重新渲染UI
15         //上面代码使用jQuery完成Ajax请求,这是为了便于说明。React本身没有任何依赖,完全可以不用jQuery,而使用其他库
16         //我们甚至可以把一个Promise对象传入组件
17         /*
18         ReactDOM.render(
19             <RepoList promise={$getJson('https://api.github.com/search/repositories?q=javascript&sort=stars')}/>,
20             document.getElementById("example")
21         )
22         */
23         //上面代码从Github的API抓取数据,然后将Promise作为属性,传给RepoList组件
24         var UserGist = React.createClass({
25             getInitialState:function(){
26                 return {
27                     username:'',
28                     lastGistUrl:''
29                 };
30             },
31             componentDidMount:function(){
32                 $.get(this.props.source,function(result){
33                     var lastGist = result[0];
34                     if(this.isMounted()){
35                         this.setState({
36                             username:lastGist.owner.login,
37                             lastGistUrl:lastGist.html_url
38                         });
39                     }
40                 }.bind(this));
41             },
42             render:function(){
43                 return (
44                     <div>
45                         {this.state.username}'s last gist is
46                         <a href={this.state.lastGistUrl}>here</a>
47                     </div>
48                 )
49             }
50         });
51         ReactDOM.render(
52             <UserGist source="https://api.github.com/users/octocat/gists" />,
53             document.getElementById("example")
54         )
55     </script>
56 </body>
57 </html>

13.组件的状态

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>react-demo13</title>
 6     <script src="build/react.js"></script>
 7     <script src="build/react-dom.js"></script>
 8     <script src="build/browser.min.js"></script>
 9     <script src="build/jquery.min.js"></script>
10 </head>
11 <body>
12     <div id="example"></div>
13     <script type="text/babel">
14         //如果promise对象正在抓取数据(pending状态),组件显示"正在加载";如果promise对象报错(rejected状态),组件显示报错信息;如果promise对象抓取数据成功(fullfilled状态),组件显示获取的数据
15         //报错:then未定义
16         var RepoList = React.createClass({
17             getInitialState:function(){
18                 return {loading:true,error:null,data:null};
19             },
20             componentDidMount:function(){
21                 this.props.promise.then(
22                     value => this.setState({loading:false,data:value}),
23                     error => this.setState({loading:false,error:error})
24                 )
25             },
26             render:function(){
27                 if(this.state.loading){
28                     return <span>Loading...</span>;
29                 }else if(this.state.error !==null){
30                     return <span>Error:{this.state.error}</span>
31                 }else{
32                     var repos = this.state.data.items;
33                     var repoList = repos.map(function(repo){
34                         return (
35                             <li>
36                                 <a href={repos.html_url}>{repo.name}</a>
37                             </li>
38                         );
39                     });
40                     return (
41                         <main>
42                             <h1>Most Popular Iavascript Projects in Github</h1>
43                             <ol>{repoList}</ol>
44                         </main>
45                     )
46                 }
47             }
48         });
49         ReactDOM.render(
50             <RepoList />,
51             document.getElementById("example")
52         )
53     </script>
54 </body>
55 </html>

 

参考原文:http://www.ruanyifeng.com/blog/2015/03/react.html

posted @ 2016-10-28 09:14  砌墙的砖  阅读(545)  评论(0编辑  收藏  举报