[关闭]
@brizer 2016-01-30T19:09:42.000000Z 字数 3536 阅读 1127

React之组件API


前言

前面学习了React有关的顶层API,本文学习与组件有关的API。


setState

  1. setState(object nextState[, function callback])

合并 nextState和当前state。这是在事件处理函数中和请求回调函数中触发 UI更新的主要方法。另外,也支持可选的回调函数,该函数在 setState执行完毕并且组件重新渲染完成之后调用。

setState() 将总是触发一次重绘,除非在 shouldComponentUpdate() 中实现了条件渲染逻辑。如果使用可变的对象,但是又不能在 shouldComponentUpdate() 中实现这种逻辑,仅在新 state 和之前的 state 存在差异的时候调用 setState() 可以避免不必要的重新渲染。

  1. var Component1 = React.createClass({
  2. getInitialState: function() {//初始化设置state
  3. return {
  4. isClick: !1
  5. }
  6. },
  7. componentDidUpdate: function(){
  8. console.log('componentDidUpdate')
  9. },
  10. clickCb: function() {
  11. this.setState({
  12. isClick : !0
  13. }, function(){
  14. console.log(this.state.isClick)
  15. })
  16. },
  17. render: function() {
  18. return (<div onClick={this.clickCb}>
  19. isClick:{this.state.isClick ? 'yes' : 'nope'}
  20. </div>)
  21. }
  22. });
  23. var div = document.getElementById('a');
  24. React.render(
  25. <Component1 />, div
  26. );

需要注意一点就是,我们在setState方法中所定义的回调,它是在组件重新渲染之后才执行的,而不是在我们变更了 nextState 的值之后就立即触发。

replaceState

  1. replaceState(object nextState[, function callback])

类似于 setState(),但是删除之前所有已存在的 state 键,这些键都不在 nextState 中。

replaceState 就是一个彻底更换掉 state 的方法,寻常使用的时候需要小心使用,避免删掉一些重要的state属性。

forceUpdate

  1. forceUpdate([function callback])

如果 render() 方法从 this.props 或者 this.state 之外的地方读取数据,你需要通过调用 forceUpdate() 告诉 React 什么时候需要再次运行 render()。如果直接改变了 this.state,也需要调用 forceUpdate()

调用 forceUpdate() 将会导致 render() 方法在相应的组件上被调用,并且子级组件也会调用自己的 render(),但是如果标记改变了,那么 React 仅会更新 DOM。

通常情况下,应该尽量避免所有使用 forceUpdate() 的情况,在 render() 中仅从 this.propsthis.state 中读取数据。这会使应用大大简化,并且更加高效。

使用 forceUpdate 的场景可以是,我们不以 propsstate 来作为触发渲染的条件,例如使用了一个变量来作为UI内容,在该变量的值改变了且我们希望触发渲染时,可以使用该方法,当然这种形式是不推荐的

getDOMNode

  1. DOMElement getDOMNode()

如果组件已经挂载到了 DOM 上,该方法返回相应的本地浏览器 DOM 元素。从 DOM 中读取值的时候,该方法很有用,比如获取表单字段的值和做一些 DOM 操作。当 render 返回 null 或者 false 的时候,this.getDOMNode() 返回 null

返回组件/ReactElement挂载到页面上所对应的DOM元素。

isMounted

  1. bool isMounted()

如果组件渲染到了 DOM 中,isMounted() 返回 true。可以使用该方法保证 setState()forceUpdate()异步场景下的调用不会出错

  1. var Component1 = React.createClass({
  2. getInitialState: function() {
  3. return {
  4. content: 'hello'
  5. }
  6. },
  7. componentWillMount: function () {//异步请求
  8. doSomething(props).then(function (content) {
  9. if (this.isMounted()) {//如果组件成功挂载在DOM中
  10. this.setState({content: content});
  11. }
  12. }.bind(this));
  13. },
  14. render: function() {
  15. if(this.state.isClick){
  16. return (<div>
  17. content:{this.state.content}
  18. </div>)
  19. } else {
  20. return false;
  21. }
  22. }
  23. });
  24. var div = document.getElementById('a');
  25. var c = React.render(
  26. <Component1 />, div
  27. );

如果该异步请求完成得很快,我们获取到新content时候组件可能还在处于挂载中(mounting)的过程,那么 state 则保持不变(因为此时 isMounted() 将返回false )。

setProps

  1. setProps(object nextProps[, function callback])

当和一个外部的 JavaScript 应用集成的时候,你可能想给一个用 React.render() 渲染的组件打上改变的标记。

尽管在同一个节点上再次调用 React.render() 来更新根组件是首选的方式,也可以调用 setProps() 来改变组件的属性,触发一次重新渲染。另外,可以传递一个可选的回调函数,该函数将会在 setProps 完成并且组件重新渲染完成之后调用。

其实setProps跟 setState 类似,不过修改的是 props 罢了:

  1. var Component1 = React.createClass({
  2. clickCb: function() {
  3. this.setProps({
  4. name : 'cnBlog'
  5. }, function(){
  6. console.log(this.props)
  7. })
  8. },
  9. render: function() {
  10. return (<div onClick={this.clickCb}>
  11. {this.props.sayhi || 'www.'}
  12. {this.props.name || 'nothing'}
  13. </div>)
  14. }
  15. });
  16. var div = document.getElementById('a');
  17. React.render(
  18. <Component1 name="VaJoy" sayhi="Hello " />, div
  19. );

replaceProps

  1. replaceProps(object nextProps[, function callback])

类似于 setProps(),但是删除所有已存在的 props,而不是合并新旧两个 props 对象。

Refs

Refs是一个使用组件的技巧。

为了获得一个到React组件的引用,我们可以使用this来得到当前的React组件,也可以通过refs来指向我们拥有的组件:

  1. var MyComponent = React.createClass({
  2. handleClick: function() {
  3. // 对myTextInput聚焦
  4. this.refs.myTextInput.getDOMNode().focus();
  5. },
  6. render: function() {
  7. // ref指向一个组件
  8. return (
  9. <div>
  10. <input type="text" ref="myTextInput" />
  11. <input
  12. type="button"
  13. value="Focus the text input"
  14. onClick={this.handleClick}
  15. />
  16. </div>
  17. );
  18. }
  19. });
  20. React.render(
  21. <MyComponent />,
  22. document.getElementById('example')
  23. );

整理一下步骤
首先绑定一个ref属性到render返回的东西上。
然后在代码中通过this.refs.ComponentName.getDOMNode()来获取对应组件的DOM节点。

Ref的作用在于给指定的子组件实例发送消息。


参考

refs
reactjs入门系列
组件API

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注