组件的数据来源,一般是经过Ajax请求从服务器获取,能够使用componentDidMount
方法设置Ajax请求,等到请求成功,再用this.setState
方法从新渲染UI。javascript
var UserGist = React.createClass({ getInitialState(){ return { username:'', lastGistUrl:'' }; }, componentDidMount(){ $.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(){ return ( <div> {this.state.username}'s last gist is <a href={this.state.lastGistUrl}>here</a>. </div> ) } }) ReactDOM.render( <UserGist source="https://api.github.com/users/octocat/gists" />, document.body )
上面代码使用jQuery完成了Ajax请求,这是为了便于说明。React自己没有任何依赖,彻底能够不用jQuery,而使用其余库。html
咱们甚至能够把一个Promise对象传入组件。java
ReactDOM.render( <RepoList promise={$.getJSON('https://api.github.com/search/repositories?q=javascript&sort=stars')} />, document.body )
上面代码从Github的API抓取数据,而后将Promise对象做为属性,传给RepoList
组件。react
若是Promise对象正在抓取数据(pending状态),组件显示“正在加载”;若是Promise对象报错(rejected状态),组件显示报错信息;若是Promise对象抓取数据成功(fulfilled状态),组件显示获取的数据。git
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 repoList = repos.map(function (repo) { return ( <li> <a href={repo.html_url}>{repo.name}</a> ({repo.stargazers_count} stars) <br/> {repo.description} </li> ); }); return ( <main> <h1>Most Popular JavaScript Projects in Github</h1> <ol>{repoList}</ol> </main> ); } } });