๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

javascript/[TIL] ๋ฆฌ์•กํŠธ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ธฐ์ˆ 

๋ฆฌ์•กํŠธ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ธฐ์ˆ  - ์ปดํฌ๋„ŒํŠธ์˜ ๋ผ์ดํ”„์‚ฌ์ดํด ๋ฉ”์„œ๋“œ

728x90

๋ผ์ดํ”„์‚ฌ์ดํด ๋ฉ”์„œ๋“œ๋Š” ์ปดํฌ๋„ŒํŠธ ์ƒํƒœ์— ๋ณ€ํ™”๊ฐ€ ์žˆ์„ ๋•Œ๋งˆ๋‹ค ์‹คํ–‰ํ•˜๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.

์ด ๋ฉ”์„œ๋“œ๋“ค์€ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ DOM์„ ์ง์ ‘ ๊ฑด๋“œ๋ ค์•ผ ํ•˜๋Š” ์ƒํ™ฉ์—์„œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€๋กœ ์ปดํฌ๋„ŒํŠธ ์—…๋ฐ์ดํŠธ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ• ๋•Œ๋Š” shouldComponentUpdate๊ฐ€ ์ค‘์š”ํ•˜๊ฒŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜ - https://intzzzero.netlify.app/blog/react-lifecycle

๋ผ์ดํ”„์‚ฌ์ดํด ๋ฉ”์„œ๋“œ๋Š” 9์ข…๋ฅ˜

Will ์ ‘๋‘์‚ฌ๋Š” ์–ด๋–ค ์ž‘์—…์„ ์ž‘๋™ํ•˜๊ธฐ ์ „์— ์‹คํ–‰๋˜๋Š” ๋ฉ”์„œ๋“œ / Did ์ ‘๋‘์‚ฌ๋Š” ์–ด๋–ค ์ž‘์—…์„ ์ž‘๋™ํ•œ ํ›„ ์‹คํ–‰๋˜๋Š” ๋ฉ”์„œ๋“œ

์ด ๋ฉ”์„œ๋“œ๋“ค์€ ์šฐ๋ฆฌ๊ฐ€ ์ปดํฌ๋„ŒํŠธ ํด๋ž˜์Šค์—์„œ ๋ฎ์–ด ์จ ์„ ์–ธํ•จ์œผ๋กœ์จ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

Mount : Dom์ด ์ƒ์„ฑ๋˜๊ณ  ์›น ๋ธŒ๋ผ์šฐ์ €์ƒ์— ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒƒ

constructor : ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ๋˜๋Š” ํด๋ž˜์Šค ์ƒ์„ฑ์ž ๋ฉ”์„œ๋“œ

getDerivedStateFromProps : props์— ์žˆ๋Š” ๊ฐ’์„ state์— ๋„ฃ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ (๐Ÿ“Œ๊ฐ€์žฅ ํ—ท๊ฐˆ๋ฆผ)

render : ์šฐ๋ฆฌ๊ฐ€ ์ค€๋น„ํ•œ UI๋ฅผ ๋žœ๋”๋งํ•˜๋Š” ๋ฉ”์„œ๋“œ

componentDidMount : ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์›น ๋ธŒ๋ผ์šฐ์ €์ƒ์— ๋‚˜ํƒ€๋‚œ ํ›„ ํ˜ธ์ถœํ•˜๋Š” ๋ฉ”์„œ๋“œ

 

 

Update : ์•„๋ž˜ 4๊ฐ€์ง€ ๊ฒฝ์šฐ์— ์—…๋ฐ์ดํŠธ

- props๊ฐ€ ๋ฐ”๋€”๋•Œ

- state๊ฐ€ ๋ฐ”๋€”๋•Œ

- ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋  ๋•Œ

- this.forceUpdate๋กœ ๊ฐ•์ œ๋กœ ๋ Œ๋”๋ง์„ ํŠธ๋ฆฌ๊ฑฐํ•  ๋•Œ

getDerivedStateFromProps : ์ด ๋ฉ”์„œ๋“œ๋Š” ๋งˆ์šดํŠธ ๊ณผ์ •์—์„œ๋„ ํ˜ธ์ถœ๋˜๋ฉฐ, ์—…๋ฐ์ดํŠธ๊ฐ€ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—๋„ ํ˜ธ์ถœ.
props์˜ ๋ณ€ํ™”์— ๋”ฐ๋ผ state ๊ฐ’์—๋„ ๋ณ€ํ™”๋ฅผ ์ฃผ๊ณ  ์‹ถ์„๋•Œ ์‚ฌ์šฉ

shouldComponentUpdate : ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง์„ ํ•ด์•ผ ํ• ์ง€ ๋ง์•„์•ผ ํ• ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฉ”์„œ๋“œ.
์ด ๋ฉ”์„œ๋“œ์—์„œ๋Š” true/false ๊ฐ’์„ ๋ฐ˜ํ™˜
- true ๋ฐ˜ํ™˜์‹œ ๋‹ค์Œ ๋ผ์ดํ”„์‚ฌ์ดํด ๋ฉ”์„œ๋“œ๋ฅผ ๊ณ„์† ์‹คํ–‰
- false ๋ฐ˜ํ™˜์‹œ ์ž‘์—… ์ค‘์ง€ (์ฆ‰, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ๋˜์ง€ ์•Š์Œ)
๋งŒ์•ฝ ํŠน์ •ํ•จ์ˆ˜์—์„œ this.forceUpdate() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค๋ฉด, ์ด ๊ณผ์ •์„ ์ƒ๋žตํ•˜๊ณ  render ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ

render : ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”๋ง

getSnapshotBeforeUpdate : ์ปดํฌ๋„ŒํŠธ ๋ณ€ํ™”๋ฅผ DOM์— ๋ฐ˜์˜ํ•˜๊ธฐ ์ง์ „์— ํ˜ธ์ถœํ•˜๋Š” ๋ฉ”์„œ๋“œ.

componentDidUdpate : ์ปดํฌ๋„ŒํŠธ์˜ ์—…๋ฐ์ดํŠธ ์ž‘์—…์ด ๋๋‚œ ํ›„ ํ˜ธ์ถœํ•˜๋Š” ๋ฉ”์„œ๋“œ

 

 

Unmount : Mount์˜ ๋ฐ˜๋Œ€๊ณผ์ •. ์ปดํฌ๋„ŒํŠธ๋ฅผ DOM์—์„œ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์„ ์–ธ๋งˆ์šดํŠธ๋ผ๊ณ  ํ•œ๋‹ค.

componentWillUnmount : ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์›น ๋ธŒ๋ผ์šฐ์ €์ƒ์—์„œ ์‚ฌ๋ผ์ง€๊ธฐ ์ „์— ํ˜ธ์ถœ

 

 

์˜ˆ์‹œ ์ฝ”๋“œ

import { Component } from "react";

class LifeCycleSample extends Component {
  state = {
    number: 0,
    color: null,
  };

  myRef = null;

  //constructor :  ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ๋˜๋Š” ํด๋ž˜์Šค ์ƒ์„ฑ์ž ๋ฉ”์„œ๋“œ
  constructor(props) {
    super(props);
    console.log("constructor");
  }

  //getDerivedStateFromProps :  ์ด ๋ฉ”์„œ๋“œ๋Š” ๋งˆ์šดํŠธ ๊ณผ์ •์—์„œ๋„ ํ˜ธ์ถœ๋˜๋ฉฐ, ์—…๋ฐ์ดํŠธ๊ฐ€ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—๋„ ํ˜ธ์ถœ.
  // props๋กœ ๋ฐ›์•„ ์˜จ ๊ฐ’์„ state์— ๋™๊ธฐํ™”์‹œํ‚ค๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉ
  static getDerivedStateFromProps(nextProps, prevState) {
    console.log("getDerivedStateFromProps");
    if (nextProps.color !== prevState.color) {
      return { color: nextProps.color };
    }
    return null;
  }

  // componentDidMount : ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๊ณ , ์ฒซ ๋ Œ๋”๋ง์„ ๋‹ค ๋งˆ์นœ ํ›„ ์‹คํ–‰
  // ์ด ์•ˆ์—์„œ ๋‹ค๋ฅธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ, ์ด๋ฒคํŠธ ๋“ฑ๋ก, setTimeout, setInterval
  // ๋„คํŠธ์›Œํฌ ์š”์ฒญ ๊ฐ™์€ ๋น„๋™๊ธฐ ์ž‘์—… ์ฒ˜๋ฆฌ
  componentDidMount() {
    console.log("componentDidMount");
  }

  // shouldComponentUpdate : ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง์„ ํ•ด์•ผ ํ• ์ง€ ๋ง์•„์•ผ ํ• ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฉ”์„œ๋“œ.
  // props or state๋ฅผ ๋ณ€๊ฒฝ์‹œ, ๋ฆฌ๋ Œ๋”๋ง์„ ์‹œ์ž‘ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฉ”์„œ๋“œ.
  // ๊ธฐ๋ณธ true ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, false ๋ฐ˜ํ™˜์‹œ ์—…๋ฐ์ดํŠธ ๊ณผ์ •์€ ์—ฌ๊ธฐ์„œ ์ค‘์ง€ ( ์„ฑ๋Šฅ ์ตœ์ ํ™”, ๋ฆฌ๋ Œ๋”๋ง ๋ฐฉ์ง€์‹œ false ๋ฐ˜ํ™˜)
  shouldComponentUpdate(nextProps, nextState) {
    console.log("shouldComponentUpdate", nextProps, nextState);
    return nextState % 10 !== 4;
  }

  // componentWillUnmount : ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์›น ๋ธŒ๋ผ์šฐ์ €์ƒ์—์„œ ์‚ฌ๋ผ์ง€๊ธฐ ์ „์— ํ˜ธ์ถœ
  // componetDidMount์—์„œ ๋“ฑ๋กํ•œ ์ด๋ฒคํŠธ, ํƒ€์ด๋จธ, ์ง์ ‘ ์ƒ์„ฑํ•œ DOM์„ ์—ฌ๊ธฐ์„œ ์ œ๊ฑฐ ์ž‘์—…์„ ํ•ด์•ผํ•จ.
  componentWillUnmount() {
    console.log("componentWillUnmount");
  }

  handleClick = () => {
    this.setState({ number: this.state.number + 1 });
  };

  // getSnapshotBeforeUpdate : ์ปดํฌ๋„ŒํŠธ ๋ณ€ํ™”๋ฅผ DOM์— ๋ฐ˜์˜ํ•˜๊ธฐ ์ง์ „์— ํ˜ธ์ถœํ•˜๋Š” ๋ฉ”์„œ๋“œ.
  // ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์ง์ „์˜ ๊ฐ’์„ ์ฐธ๊ณ ํ•  ์ผ์ด ์žˆ์„ ๋•Œ ํ™œ์šฉ.
  getSnapshotBeforeUpdate(prevProps, prevState) {
    console.log("getSnapshotBeforeUpdate");
    if (prevProps.color !== prevState.color) {
      return this.myRef.style.color;
    }
    return null;
  }

  // componentDidUdpate : ์ปดํฌ๋„ŒํŠธ์˜ ์—…๋ฐ์ดํŠธ ์ž‘์—…์ด ๋๋‚œ ํ›„ ํ˜ธ์ถœํ•˜๋Š” ๋ฉ”์„œ๋“œ
  // prevProps, prevState๋ฅผ ์‚ฌ์šฉํ•ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ด์ „์— ๊ฐ€์กŒ๋˜ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผ
  // getSnapshopBeforeUpdate์—์„œ ๋ฐ˜ํ™˜ํ•œ ๊ฐ’์ด ์žˆ๋‹ค๋ฉด ์—ฌ๊ธฐ์„œ snapshot ๊ฐ’์„ ์ „๋‹ฌ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ.
  componentDidUpdate(prevProps, prevState, snapshot) {
    console.log("componentDidUpdate");
    if (snapshot) {
      console.log("์—…๋ฐ์ดํŠธ๋˜๊ธฐ ์ง์ „ ์ƒ‰์ƒ: ", snapshot);
    }
  }

  render() {
    console.log("render");
    const style = {
      color: this.props.color,
    };

    return (
      <>
        {this.props.missing.value}
        <h1
          style={style}
          ref={(ref) => {
            this.myRef = ref;
          }}
        >
          {this.state.number}
        </h1>
        <p>{this.state.color}</p>
        <button onClick={this.handleClick}>๋”ํ•˜๊ธฐ</button>
      </>
    );
  }
}
export default LifeCycleSample;
728x90