React 컴포넌트 수명주기


이 장에서는 React 구성 요소의 수명주기에 대해 논의합니다.

구성 요소의 수명 주기는 세 가지 상태로 나눌 수 있습니다.

  • 마운팅: 실제 DOM에 삽입

  • 업데이트: 다시 렌더링 중

  • 언마운트: 실제 DOM에서 이동

라이프 사이클 방법에는 다음이 있습니다.

  • comComponentWillMount 클라이언트와 서버 모두에서 렌더링 전에 호출됩니다.

  • comComponentDidMount: 첫 번째 렌더링 후에 호출되며 클라이언트측에서만 호출됩니다. 그 후 구성 요소는 this.getDOMNode()를 통해 액세스할 수 있는 해당 DOM 구조를 생성했습니다. 다른 JavaScript 프레임워크와 함께 사용하려면 setTimeout, setInterval을 호출하거나 이 메서드에서 AJAX 요청을 보낼 수 있습니다(외부 작업이 UI를 차단하는 것을 방지하기 위해).

  • comComponentWillReceiveProps은 구성 요소가 새 prop을 받으면 호출됩니다. 이 메서드는 렌더링을 초기화할 때 호출되지 않습니다.

  • shouldComponentUpdate 부울 값을 반환합니다. 구성 요소가 새 소품이나 상태를 받을 때 호출됩니다. 초기화 중이나 forceUpdate를 사용할 때는 호출되지 않습니다.
    구성요소를 업데이트할 필요가 없음을 확인한 경우 사용할 수 있습니다.

  • comComponentWillUpdate는 구성 요소가 새 prop이나 상태를 받았지만 아직 렌더링되지 않은 경우 호출됩니다. 초기화 중에는 호출되지 않습니다.

  • comComponentDidUpdate 구성 요소 업데이트가 완료된 직후 호출됩니다. 초기화 중에는 호출되지 않습니다.

  • comComponentWillUnmount는 구성 요소가 DOM에서 제거되면 즉시 호출됩니다.

이러한 방법에 대한 자세한 지침은 공식 문서를 참조하세요.

다음 예제에서는 Hello 구성 요소가 로드된 후 componentDidMount 메서드를 통해 타이머를 설정하고 100밀리초마다 구성 요소의 투명도를 재설정한 다음 다시 렌더링합니다.

Instance

<!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>

Run Instance»

Click 온라인 인스턴스를 보려면 "인스턴스 실행" 버튼을 누르세요.

다음 인스턴스는 state 초기화되고, setNewnumberstate를 업데이트하는 데 사용됩니다. 모든 수명주기는 Content 구성 요소에 있습니다.

Instance

<!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>

인스턴스 실행 »

온라인 인스턴스를 보려면 "인스턴스 실행" 버튼을 클릭하세요