Frontend/React

React | ์ƒ๋ช… ์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ(Lifecyle Methods)

์ด์ œํฌ 2023. 11. 28. 16:00


์ƒ๋ช… ์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํŠน์ • ์ƒํƒœ์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋œ๋‹ค.

ex) ์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ, ์—…๋ฐ์ดํŠธ, ์ œ๊ฑฐ ๋“ฑ๋“ฑ...

React์˜ ์ฃผ์š” ์ƒ๋ช… ์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

1. componentDidMount()

  • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ฆฐ ๋œ ์งํ›„์— ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค.
  • ์ฃผ๋กœ ์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ, ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ดˆ๊ธฐํ™” ๋“ฑ์— ์‚ฌ์šฉ๋œ๋‹ค.
import React, { Component } from 'react';

class MyComponent extends Component {
    constructor(props) {
        super(props);
    }
    
    componentDidMount() {
    	// ์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ
    }
    
    render() {
    	return (<h1>MyComponent</h1>);
    }
}

export default MyComponent;

2. shouldComponentUpdate(nextProps, nextState)

  • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜๊ธฐ ์ „์— ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค.
  • ๋ฆฌ๋ Œ๋”๋ง(re-rendering) ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.
    • true ๋ฐ˜ํ™˜ : ๋ฆฌ๋ Œ๋”๋ง ์‹คํ–‰
    • false ๋ฐ˜ํ™˜ : ๋ฆฌ๋ Œ๋”๋ง ์‹คํ–‰ X
  • state๊ฐ€ ๋ณ€๊ฒฝ๋จ์— ๋”ฐ๋ผ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง๋˜๋Š”๋ฐ, ํŠน์ • ์กฐ๊ฑด์— ์ผ์น˜ํ• ๋•Œ๋งŒ ๋ Œ๋”๋ง ๋˜๋„๋ก ์ œ์–ด ํ•  ์ˆ˜ ์žˆ๋‹ค.
import React, { Component } from 'react';

class MyComponent extends Component {
    constructor(props) {
        super(props);
    }
    
    shouldComponentUpdate(nextProps, nextState) {
    	if (this.props.someValue !== nextProps.someValue) {
        	return true; // ๋ฆฌ๋ Œ๋”๋ง ์‹คํ–‰
        }
        if (nextState.count % 2 === 0 ) {
        	return true; // ๋ฆฌ๋ Œ๋”๋ง ์‹คํ–‰
        }
        return false; // ๋ฆฌ๋ Œ๋”๋ง ์‹คํ–‰ X
    }
    
    render() {
    	return (<h1>MyComponent</h1>);
    }
}

export default MyComponent;

3. componentDidUpdate(prevProps, prevState)

  • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋œ ํ›„์— ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค.
  • ์ด์ „ ์†์„ฑ(prevProps)๊ณผ ์ด์ „ ์ƒํƒœ(prevState)์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
import React, { Component } from 'react';

class MyComponent extends Component {
    constructor(props) {
        super(props);
    }
    
    componentDidUpdate(prevProps) {
    	// ์ด์ „ ์†์„ฑ๊ณผ ํ˜„์žฌ ์†์„ฑ ๋น„๊ต๋ฅผ ํ†ตํ•ด ์ถ”๊ฐ€ ๋™์ž‘ ์‹คํ–‰ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ • ๊ฐ€๋Šฅ
    	if (prevProsp.someValue !== this.props.someValue) {
        	// ์ถ”๊ฐ€ ๋™์ž‘ ์‹คํ–‰
        }
    }
    
    render() {
    	return (<h1>MyComponent</h1>);
    }
}

export default MyComponent;

4.componentWillUnmount()

  • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ œ๊ฑฐ๋˜๊ธฐ ์ „์— ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค.
  • ์ฃผ๋กœ ๋ฆฌ์†Œ์Šค ํ•ด์ œ, ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์ œ๊ฑฐ ๋“ฑ์˜ ์ •๋ฆฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.
import React, { Component } from 'react';

class MyComponent extends Component {
    constructor(props) {
        super(props);
    }
    
    componentDidMount() {
    	window.addEventListener('resize', this.handleResize); // ์ปดํฌ๋„ŒํŠธ ๋งˆ์šดํŠธ๋œ ํ›„ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋“ฑ๋ก
  	}

  	componentWillUnmount() {
    	window.removeEventListener('resize', this.handleResize); // ์ปดํฌ๋„ŒํŠธ ์ œ๊ฑฐ ์ „์— ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์ œ๊ฑฐ
  	}

  	handleResize() {
    	console.log('Window resized!'); // ์ฐฝ ํฌ๊ธฐ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ
  	}
    
    render() {
    	return (<h1>MyComponent</h1>);
    }
}

export default MyComponent;
๋ฐ˜์‘ํ˜•