React

component lifecycle(<16.3이전)

youngseokim_kr 2021. 11. 20. 18:53

component 생성 및 마운트

<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <meta http-equiv="X-UA-Compatoble" content="ie=edge" />
  <title>Example</title>
</head>
<body>
  <div id="root"></div>
<script crossorigin src="https://unpkg.com/react@17/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<script type="text/babel">
    console.log(React);
    console.log(ReactDOM);
    
    class App extends React.Component {
      state = {
        age:39,
      };
      constructor(props) {
        super(props);

        console.log("constructor", props);
      }
      render() {
        console.log('render');
        return (
          <div>
            <h2>
              Hello {this.props.name}  {this.state.age}
            </h2>
          </div>
        );
      }
      componentWillMount() {
        console.log('componentWillMount');
      }
      componentDidMount() {
        console.log('componentDidMount');

        setInterval(() => {
          //console.log("setInterval");
          this.setState(state => ({...state,age: state.age+1}))
        },1000)
      }
    }

    ReactDOM.render(<App name="Mark" />, document.querySelector("#root"))
    
  </script>
  </body>
</html>

component props, state 변경

<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <meta http-equiv="X-UA-Compatoble" content="ie=edge" />
  <title>Example</title>
</head>
<body>
  <div id="root"></div>
<script crossorigin src="https://unpkg.com/react@17/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<script type="text/babel">
    console.log(React);
    console.log(ReactDOM);
    
    class App extends React.Component {
      state = {
        age:39,
      };
      constructor(props) {
        super(props);

        console.log("constructor", props);
      }
      render() {
        console.log('render');
        return (
          <div>
            <h2>
              Hello {this.props.name}  {this.state.age}
            </h2>
          </div>
        );
      }
      componentWillMount() {
        console.log('componentWillMount');
      }
      componentDidMount() {
        console.log('componentDidMount');

        setInterval(() => {
          //console.log("setInterval");
          this.setState(state => ({...state,age: state.age+1}))
        },1000)
      }

      componentWillReceiveProps(nextProps) {
        console.log("componentWillReceiveProps",nextProps);
      }

      shouldComponentUpdate(nextProps,nextState) {
        console.log("shouldComponentUpdate",nextProps,nextState);

        return true;
      }

      componentWillUpdate(nextProps,nextState) {
        console.log("componentWillUpdate",nextProps,nextState);
      }

      componentDidUpdate(prevProps,prevState) {
        console.log("componentDidUpdate",prevProps,prevState);
      }
    }


    ReactDOM.render(<App name="Mark" />, document.querySelector("#root"))
    
  </script>
  </body>
</html>

componentWillReceiveProps

props 를 새로 지정했을 때 바로 호출

여기는 state 의 변경에 반응하지 않는다.

    여기서 props 의 값에 따라 state 를 변경해야 한다면,

    setState 를 이용해 state 를 변경합니다. 

    그러면 다음 이베느로 각각 가는것이 아니라 한번에 변경

ShouldComponentUpdate

props 만 변경되도 state 만변경되어도 props& stae 둘다 변경되도

newProps 와 new State를 인자로 해서 호출

return type 이 boolean 입니다. true 면 render false면 render 가 호출되지 않는다.

이 함수를 구현하지 않으면 디폴트는 true

componentWillUdate

컴포넌트가 재 랜더링 되기 직전에 불리고 여기서 setstate 같은 것을 쓰면 안된다.

componentDidUpdate

컴포넌트가 재 랜더링을 마치면 불립니다.

component 언마운트