[关闭]
@brizer 2016-02-13T05:52:30.000000Z 字数 3536 阅读 1588

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.props 和 this.state 中读取数据。这会使应用大大简化,并且更加高效。

使用 forceUpdate 的场景可以是,我们不以 props 或 state 来作为触发渲染的条件,例如使用了一个变量来作为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

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