React 元件生命週期


在本章節中我們將討論 React 元件的生命週期。

元件的生命週期可分成三個狀態:

  • Mounting:已插入真實DOM

  • Updating:正在被重新渲染

  • Unmounting:已移出真實DOM

#生命週期的方法有:


  • componentWillMount
  • 在渲染前呼叫,在客戶端也在服務端。
  • componentDidMount
  • : 在第一次渲染後調用,只在客戶端。之後元件已經產生了對應的DOM結構,可以透過this.getDOMNode()來存取。 如果你想和其他JavaScript框架一起使用,可以在這個方法中呼叫setTimeout, setInterval或發送AJAX請求等操作(防止異部操作阻塞UI)。
  • componentWillReceiveProps
  • 在元件接收到一個新的prop時被呼叫。這個方法在初始化render時不會被呼叫。
  • shouldComponentUpdate
  • 傳回一個布林值。在元件接收到新的props或state時被呼叫。初始化時或使用forceUpdate時不被呼叫。
可以在你確認不需要更新元件時使用。

componentWillUpdate

在元件接收到新的props或state但還沒有render時被呼叫。在初始化時不會被呼叫。

componentDidUpdate
在元件完成更新後立即呼叫。在初始化時不會被呼叫。

componentWillUnmount

在元件從 DOM 移除的時候立刻被呼叫。 這些方法的詳細說明,可以參考官方文件以下實例在Hello 元件載入以後,透過componentDidMount 方法設定一個計時器,每隔100毫秒重新設定元件的透明度,並重新渲染:

##範例

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>php中文网 React 实例</title>
    <script src="http://static.php.cn/assets/react/react-0.14.7/build/react.js"></script>
    <script src="http://static.php.cn/assets/react/react-0.14.7/build/react-dom.js"></script>
    <script src="http://static.php.cn/assets/react/browser.min.js"></script>
  </head>
 <body>
    <div id="example"></div>

    <script type="text/babel">
      var Hello = React.createClass({
        getInitialState: function () {
          return {
            opacity: 1.0
          };
        },

        componentDidMount: function () {
          this.timer = setInterval(function () {
            var opacity = this.state.opacity;
            opacity -= .05;
            if (opacity < 0.1) {
              opacity = 1.0;
            }
            this.setState({
              opacity: opacity
            });
          }.bind(this), 100);
        },

        render: function () {
          return (
            <div style={{opacity: this.state.opacity}}>
              Hello {this.props.name}
            </div>
          );
        }
      });

      ReactDOM.render(
        <Hello name="world"/>,
        document.getElementById('example')
      );
    </script>
  </body>
</html>

運行實例»點擊"運行實例"按鈕查看在線實例

以下實例初始化

state

setNewnumber
用來更新###state###。所有生命週期在 ###Content### 元件中。 #########實例######
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>php中文网 React 实例</title>
    <script src="http://static.php.cn/assets/react/react-0.14.7/build/react.js"></script>
    <script src="http://static.php.cn/assets/react/react-0.14.7/build/react-dom.js"></script>
    <script src="http://static.php.cn/assets/react/browser.min.js"></script>
  </head>
 <body>
    <div id="example"></div>

    <script type="text/babel">
    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 RECIEVE 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')
      );
    </script>
  </body>
</html>
#########運行實例»######點擊"運行實例" 按鈕查看線上實例###### ############