1.this.state
组件免不了要与用户互动,React 的一大创新,就是将组件看成是一个状态机,一开始有一个初始状态,然后用户互动,导致状态变化,从而触发重新渲染 UI
1 var TestStateComponent = React.createClass({ 2 getInitialState: function () { 3 return { 4 liked: false 5 } 6 }, 7 handleClick: function (event) { 8 this.setState({ 9 liked: !this.state.liked 10 }) 11 }, 12 render: function () { 13 var text = this.state.liked ? "like" : "haven't liked" 14 return ( 15 <p onClick={this.handleClick}> 16 You {text} this Click to toggle 17 </p> 18 ) 19 } 20 }) 21 ReactDOM.render(<TestStateComponent/>,document.getElementById('container'))
上面代码是一个 TestStateComponent 组件,它的 getInitialState 方法用于定义初始状态,也就是一个对象,这个对象可以通过 this.state 属性读取。当用户点击组件,导致状态变化,this.setState 方法就修改状态值,每次修改以后,自动调用 this.render 方法,再次渲染组件。
由于 this.props 和 this.state 都用于描述组件的特性,可能会产生混淆。一个简单的区分方法是,this.props 表示那些一旦定义,就不再改变的特性,而 this.state 是会随着用户互动而产生变化的特性。
2.表单
1 <!-- 用户在表单填入的内容,属于用户跟组件的互动,所以不能用 this.props 读取 --> 2 var Input = React.createClass({ 3 getInitialState: function () { 4 return { 5 inputVal: '' 6 } 7 }, 8 handleChange: function (event) { 9 console.log(event.target.value) 10 this.setState({ 11 inputVal: event.target.value 12 }) 13 }, 14 render: function () { 15 var value = this.state.inputVal 16 return ( 17 <div> 18 <input type="text" vaule={value} onChange={this.handleChange}/> 19 <p>{value}</p> 20 </div> 21 ) 22 } 23 }) 24 <!-- 上面代码中,文本输入框的值,不能用 this.props.value 读取,而要定义一个 onChange 事件的回调函数,通过 event.target.value 读取用户输入的值。textarea 元素、select元素、radio元素都属于这种情况, --> 25 ReactDOM.render(<Input/>,document.getElementById('container'))
3.Ajax
1 var UserList = React.createClass({ 2 getInitialState: function () { 3 return { 4 userName: '', 5 lastGisUrl 6 } 7 }, 8 componentDidMunt: function () { 9 $.get(this.props.source, function (res) { 10 var lastDist = res[0] 11 this.setState({ 12 username: lastGist.owner.login, 13 lastGistUrl: lastGist.html_url 14 }); 15 }.bind(this)) 16 }) 17 }, 18 <!-- 当异步加载数据的时候, 使用 componentWillUnmount 来取消任何未完成的请求 在组件卸载之前 --> 19 componentWillUnmount: function() { 20 this.serverRequest.abort() 21 }, 22 render: function() { 23 return ( 24 <div> 25 {this.state.username}'s last gist is 26 <a href={this.state.lastGistUrl}>here</a>. 27 </div> 28 ) 29 } 30 }) 31 <!-- 在组件从 DOM 中移除的时候立刻被调用。 32 在该方法中执行任何必要的清理,比如无效的定时器,或者清除在 componentDidMount 中创建的 DOM 元素 33 所以我们可以用这个方法替代 isMounted() 来确保该组件是否还是mounted --> 34 ReactDOM.render( 35 <UserList source="https://api.github.com/users/octocat/gists" />, 36 document.getElementById('container') 37 ) 38 <!-- 上面代码从Github的API抓取数据,然后将Promise对象作为属性,传给RepoList组件。 39 如果Promise对象正在抓取数据(pending状态),组件显示"正在加载";如果Promise对象报错(rejected状态),组件显示报错信息;如果Promise对象抓取数据成功(fulfilled状态),组件显示获取的数据。 -->