引入原则:
<head>
</script>
</script>
</script>
</head>
body区域
<div id='example'></div>
<script type='text/bable'>
//**our codes goes here!
</script>
实际上线用babel进行转换
bable src --out-dir build
ReactDOM.render()
示例:
ReactDOM.render(
<h1>hello world!</h1>,
document.getElementById('example');
)
JSX语法
var names =['Alice','Emily','Kate'];
ReactDOM.render(
<div>
{
names.map(function(name){ return <div>Hello,{name}!</div>})
}
</div>,
document.getElementById('example')
);
JSX容许在模板中直接插入JavaScript变量
var arr = [
<h1>Hello world!</h1>,
<h2>React is awesome</h2>
];
ReactDOM.render(
<div>{arr}</div>,
document.getElementById('example')
);
组件
React.createClass用于生成一个组件类
var HelloMessage = React.creatClass({
render:function(){return <h1>Hello {this.props.name}</h1>;}
});
ReactDOM.render(
<HelloMessage name='john' />,
document.getElementById('example')
);
组件的第一个字母必须大写
组件只能蕴含一个顶层标签
class属性需要写成className
this.props.children
this.props.children 示意组件所有的子节点
var NoteList = React.createClass({
render:function(){
return( <ol> { React.Children.map(this.props.children,function(child){ return <li>{child}</li> }) } </ol> );}
});
ReactDOM.render(
<NoteList>
<span>hello</span><span>World</span>
</NoteList>,
document.body
);
使用React.Children.map来遍历子节点,不必担心this.props.children的数据类型
PropTypes
考据实例的属性是否符合申请
var MyTitle = react.createClass({
propTypes:{
title:React.PropTypes.string.isRequired, },
render:function(){
return <h1>{this.props.title}</h1> }
});
var data = 123;
ReactDOM.render(
<MyTitle title={data} />,
document.body
);
getDefaultProps可能用来设置组件属性的默认值
getDefaultProps:function(){
return {
title: 'Hello World' };
}
获取实在的DOM节点
有时需要从组件中获取实在的DOM节点,需要用到ref属性。
var MyComponet = React.CreatClass({
handleClick:function(){
this.refs.myTextInput.focus();
},
render:function(){
return ( <div> <input type='text' ref='myTextInput' /> <input type='button' value ='Focus the text input' onClick={this.handleClick} /> </div> );}
});
ReactDOM.render(
<MyComponet />,
document.getElementById('example')
);
指定click事件回调函数,确保DOM实在渲染后触发,除此还反对KeyDown等事件
this.state
组件视为状态机,用户互动,状态变动,从新渲染UI。
var LikeButton = React.CreatClass({
getInitialState:function(){
return {liked:false};},
handleClick:function(event){
this.setState({liked: !this.state.liked});},
render:function(){
var text = this.state.liked? 'like':'haven\'t liked'; return( <p onClicked={this.handleClick}> You {text} this. Click to toggle. </p> );}
});
ReactDom.render(
<LikeButton />,
document.body
);
this.props示意一旦定义不再更改的属性,this.state示意随用户互动产生变动的个性。
表单
var Input = React.createClass({
getInitialState:function(){ return {value:'Hello!'};},handleChange:function(event){ this.setState({value:event.target.value});},render:function(){ var value = this.state.value; return ( <div> <input type='text' value = {value} onChange = {this.handleChange} /> <p>{value}</p> </div> );}
});
ReactDOM.render(<Input />,document.body);
这里取得输入框的值没有使用this.props.value,选用了event.target.value。
组件的生命周期
Mounting: 已插入实在DOM
Updating: 正在被从新渲染
Unmounting:已移除实在DOM
var Hello = React.createClass({
getInitialState:function() return { opacity:1.0 }},compontentDidMount:function(){ this.timer = setInterval (function() { var opacity = this.state.opacity; opacity -= .05; if(opacity < 0.1){ opacity = 1.0; } this.setState({ opacity:opacity }); }.bind(this),100);},render: function(){ return ( <div style = {{opacity:this.state.opacity}}> Hello {{this.props.name} </div> );}
});
ReactDOM.render(
<Hello name='world' />,
document.body
);
bind(this)——原生JS写法。
Ajax
使用compontentDidMount方法设置Ajax请求
var UserGist = React.createClass({
getInitialState:function(){ return { username:'', lastGistUrl:'' }},componentDidMount: function(){ $.get(this.props.source,function(result){ var lastGist = result[0]; if(this.isMounted()){ this.setState({ username:lastGist.owner.login, lastGistUrl:lastGist.html_url }); } }.bind(this));},render:function(){ return ( <div> {this.state.username}'s last gist is <a href={this.state.lastGistUrl}>here</a>. </div> );}
});
ReactDOM.render(
<UserGist source = 'http:xx.xxx.com' />,document.body
);
把其余路径获取的对象传入组件
ReactDOM.render(
<RepoList promise = {$.getJSON('http://xx.xxx.com)} />,document.body
);
var RepoList = React.createClass({
getInitialState: function(){ return { loading:true, error : null , data : null}},componentDidMount(){ this.props.promise.then( value => this.setState({loading:false,data:value}), error => this.setState({loading:false,error:error}));},render:function(){ if(this.state.loading){ return <span>Loading…</span> } else if(this.state.error !== null){ return <span>Error: {this.state.error.message}</span>; } else{ var repos = this.state.data.items; var reposList = repos.map(function(repo){ return ( <li> <a href={repo.html}>{repo.name}</a> </li> ); }); return ( <main> <h1>Most Popular JavaScript Projects in Github</h1> <ol> {repoList} </ol> </main> ); }}
});