React 组件 API
React 组件 API 中有以下7个常用方法:
- 设置状态:setState
- 替换状态:replaceState
- 设置属性:setProps
- 替换属性:replaceProps
- 强制更新:forceUpdate
- 获取DOM节点:findDOMNode
- 判断组件挂载状态:isMounted
setState
1
| setState(nextState[, callback])
|
- nextState:一个对象。将要设置的新状态,该状态会和当前的state合并
- callback:回调函数。该函数会在setState设置成功,且组件重新渲染后调用
replaceState
1
| replaceState(nextState[, callback])
|
- nextState:一个对象。将要设置的新状态,该状态会替换当前的state。
- callback:回调函数。该函数会在replaceState设置成功,且组件重新渲染后调用。
setProps
1
| setProps(nextProps[, callback])
|
- nextProps:一个对象。将要设置的新属性,该状态会和当前的props合并
- callback:回调函数。该函数会在setProps设置成功,且组件重新渲染后调用
replaceProps
1
| replaceProps(nextProps[, callback])
|
- nextProps:一个对象。将要设置的新属性,该属性会替换当前的props。
- callback:回调函数。该函数会在replaceProps设置成功,且组件重新渲染后调用。
forceUpdate
- callback:回调函数。该函数会在组件render()方法调用后调用。
forceUpdate()方法会使组件和子组件调用自身的render()方法重新渲染组件。但是,组件重新渲染时,依然会读取this.props和this.state,如果状态没有改变,那么React只会更新DOM。
一般来说,应该尽量避免使用forceUpdate(),而仅从this.props和this.state中读取状态并由React触发render()调用。
findDOMNode
1
| DOMElement findDOMNode()
|
如果组件已经挂载到DOM中,该方法返回对应的本地浏览器 DOM 元素。当render返回null 或 false时,this.findDOMNode()也会返回null。
isMounted
返回值:true或false,表示组件是否已挂载到DOM中。可以使用该方法保证了setState()和forceUpdate()在异步场景下的调用不会出错。
组价生命周期
组件的生命周期可分成三个状态:
- Mounting:已插入真实 DOM
- Updating:正在被重新渲染
- Unmounting:已移出真实 DOM
生命周期的方法
- componentWillMount: 在渲染前调用, 在客户端也在服务端。
- componentDidMount:在第一次渲染后调用,只在客户端。之后组件已经生成了对应的DOM结构,可以通过this.getDOMNode()来进行访问。
- componentWillReceiveProps:在组件接收到一个新的 prop 时被调用。这个方法在初始化render时不会被调用。
- shouldComponentUpdate:返回一个布尔值。在组件接收到新的props或者state时被调用。在初始化时或者使用forceUpdate时不被调用。
- componentWillUpdate:在组件接收到新的props或者state但还没有render时被调用。在初始化时不会被调用。
- componentDidUpdate:在组件完成更新后立即调用。在初始化时不会被调用。
- componentWillUnmount:在组件从 DOM 中移除的时候立刻被调用。
具体见官方文档(中文)
生命周期的实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| var Button = React.createClass({ getInitialState: function() { return { data:0 }; }, setNewNumber: function() { this.setState({data: this.state.data + 1}) }, render: function () { return ( <div> <button onClick = {this.setNewNumber}>INCREMENT</button> <Content myNumber = {this.state.data}></Content> </div> ); } }); var Content = React.createClass({ componentWillMount:function() { console.log('Component WILL MOUNT!') }, componentDidMount:function() { console.log('Component DID MOUNT!') }, componentWillReceiveProps:function(newProps) { console.log('Component WILL RECEIVE PROPS!') }, shouldComponentUpdate:function(newProps, newState) { return true; }, componentWillUpdate:function(nextProps, nextState) { console.log('Component WILL UPDATE!'); }, componentDidUpdate:function(prevProps, prevState) { console.log('Component DID UPDATE!') }, componentWillUnmount:function() { console.log('Component WILL UNMOUNT!') }, render: function () { return ( <div> <h3>{this.props.myNumber}</h3> </div> ); } }); ReactDOM.render( <div> <Button /> </div>, document.getElementById('example') );
|