Small Grey Outline Pointer React :: 라이프 사이클
본문 바로가기
Dev./React

React :: 라이프 사이클

by sso. 2022. 8. 24.

class 컴포넌트의 라이프 스타일 

클래스 컴포넌트에서만 작동 된다

 

 

constructor(생성자)

제일 먼저 실행되는 함수

 

getDerivedStateFromProps

state 와 props를 동기화 시켜주는 함수

 

render

UI를 그려주는 함수

 

componentDidMount

마지막으로 호출 되는 함수, UI 셋팅이 끝나면 알려준다

 

 


mounting

import React, { Component } from 'react';
import BoxClass from './component/BoxClass';
export default class AppClass extends Component {
    //컴포넌트가 실행되자마자 바로 호출 된다
    constructor(props) {
        super(props);
        this.state = {
            counter2: 0,
            num: 1,
            value: 0,
        };
        console.log('constructor 확인용!');
    }
    increase = () => {
        //전달할 객체 안에 this 붙여서 작성한다
        this.setState({ counter2: this.state.counter2 + 1, value: this.state.value + 1 });
    };
    componentDidMount() {
        console.log('componentDidMount 확인용!');
    }
    render() {
        console.log('render 확인용!!');
        return (
            <div className="App">
                <div>state : {this.counter2}</div>
                <button onClick={this.increase}>클릭!</button>
                <BoxClass num={this.state.value} />
            </div>
        );
    }
}

 

 

constructor 안에서는 state를 만드는게 우선이다

render : UI 를 그려준다

componentDidMount : api 호출

렌더로 ui를 그려주고 난 다음에 componentDidMount를 호출한다

 
 
 
 
 
 

updating

import React, { Component } from 'react';
import BoxClass from './component/BoxClass';
export default class AppClass extends Component {
    //컴포넌트가 실행되자마자 바로 호출 된다
    constructor(props) {
        super(props);
        this.state = {
            counter2: 0,
            num: 1,
            value: 0,
        };
        console.log('constructor 확인용!');
    }
    increase = () => {
        //전달할 객체 안에 this 붙여서 작성한다
        this.setState({ counter2: this.state.counter2 + 1, value: this.state.value + 1 });
        console.log('increase 함수는 잘 되고 있는가?', this.state);
    };
    //렌더로 ui를 그려주고 난 다음에 componentDidMount 함수를 호출한다
    componentDidMount() {
        console.log('componentDidMount 확인용!');
    }
    //
    componentDidUpdate() {
        console.log('componentDidUpdate 확인용!', this.state);
    }
    render() {
        console.log('render 확인용!!');
        return (
            <div className="App">
                <div>state : {this.counter2}</div>
                <button onClick={this.increase}>클릭!</button>
                <BoxClass num={this.state.value} />
            </div>
        );
    }
}
 
 

componentDidUpdate() 함수 호출

 

 

componentDidUpdate : 렌더 되자마자 componentDidUpdate 를 통해서 최신화 된 값을 바로 받아들일 수 있다
최신화 된 값을 사용하고자 한다면 componentDidUpdate 를 이용하면 된다

 

 

 

 

unmounting : app이 종료 될 때

componentWillUnmount

 

 


 

 

function 컴포넌트에서는 어떻게 쓸까?

import { useState, useEffect } from 'react';

useEffect : react 훅의 한 종류

 

 

 

import { useState, useEffect } from 'react';
import './App.css';

function App() {
    let counter = 0;
    const [counter2, setCounter2] = useState(0); //react hook
    const increase = () => {
        counter += 1;
        setCounter2(counter2 + 1);
        //console.log('카운터 확인!', counter, '카운터2확인!!', counter2);
    };
    //콜백과 배열을 인자로 받는다
    useEffect(() => {
        console.log('useEffect 작동 확인');
    }, []);
    return (
        <div className="App">
            {/* 자바스크립트와 html을 믹스하고 싶을 때는 중괄호{}로 사용한다 */}
            {console.log('렌더작업은 잘 되고 있는가? 확인용')}
            <div>{counter}</div>
            <div>state : {counter2}</div>
            <button onClick={increase}>클릭!</button>
        </div>
    );
}

// 1. 유저가 버튼 클릭함
// 2. 카운터가 +1이 되어서 1이 된다
// 3. 셋스테이트함수 (셋카운터2)가 호출 된다
// 4. 콘솔로그가 실행되는데, 이때 변수값은 1로 보여지고, 스테이트 값은 아직 변하지 않았기 때문에 그 전의 값이 보인다
// 5. 인크리즈 함수가 끝이 난다
// 6. 함수가 끝나면 앱이 다시 리-렌더링 된다
// 7. let counter =0 을 거치면서 카운터 값이 다시 0으로 초기화 된다
export default App;

 

 

 

 

 

useEffect 는 렌더 뒤에 나오고 있다 (useEffect는 componentDidMount를 커버하고 있다)

 

 

 

useEffect 배열의 쓰임

useEffect의 array는 componentDidUpdate를 커버하게 된다
array에 state를 넣는 것
배열에 담긴 값을 주시하고 있게 된다 업데이트(렌더)가 되자마자 업데이트가 되어진 새로운 값을 보여준다
  useEffect(() => {
        console.log('useEffect 1st 작동 확인');
    }, []);
    useEffect(() => {
        console.log('useEffect 2st 작동 확인');
    }, [counter2]);

 

 

 

배열안에 들어간 값 중에 한개라도 state가 변하면 useEffect는 호출이 되어 실행 된다

두개가 동시에 다 바뀌어도 두번 실행되는 건 아니다 한번만 실행 된다

 

function App() {
    let counter = 0;
    const [counter2, setCounter2] = useState(0); //react hook
    const [value, setValue] = useState(0);
    const increase = () => {
        counter += 1;
        /* setCounter2(counter2 + 1); */
        setValue(value + 2);
        //console.log('카운터 확인!', counter, '카운터2확인!!', counter2);
    };
    //콜백과 배열을 인자로 받는다
    useEffect(() => {
        console.log('useEffect 1st 작동 확인');
    }, []);
    useEffect(() => {
        console.log('useEffect 2st 작동 확인', counter2);
    }, [counter2]);
    useEffect(() => {
        console.log('value는 다른 것으로 출력하고 싶다!', value);
    }, [value]);
    return (
        <div className="App">
            {/* 자바스크립트와 html을 믹스하고 싶을 때는 중괄호{}로 사용한다 */}
            {console.log('렌더작업은 잘 되고 있는가? 확인용', counter2)}
            <div>{counter}</div>
            <div>state : {counter2}</div>
            <button onClick={increase}>클릭!</button>
        </div>
    );
}

 

따로 관리하고 싶다면 useEffect를 만들어서 독립시키면 된다

array 안에 스테이트 값이 들어가있으면 디드업데이트처럼 작동한다

 

728x90

'Dev. > React' 카테고리의 다른 글

React :: Router / Restful Route  (0) 2022.09.05
React :: 날씨 앱 만들기  (0) 2022.08.29
React :: 클래스 컴포넌트  (0) 2022.08.22
React :: 가위바위보 게임 만들기  (0) 2022.08.17
React :: 버튼 클릭시 숫자 카운트 되기  (0) 2022.08.12

댓글