๊ณต๋ถ€ ๊ธฐ๋ก โœ๏ธ/React

[React] study (state,) #3์ผ์ฐจ

๋ฒ„๋‘˜ 2023. 4. 12. 16:55

๐Ÿ“– ์ฐธ๊ณ  ์„œ์ :

์†Œํ”Œ์˜ ์ฒ˜์Œ ๋งŒ๋‚œ ๋ฆฌ์•กํŠธ 

๐Ÿ“†  ์ง„ํ–‰

chapter 6 State์™€ ์ƒ๋ช…์ฃผ๊ธฐ โœ…

chapter 7 ํ›… โœ…

chapter 8 ์ด๋ฒคํŠธ ํ•ธ๋“ค๋ง โœ…

 


6. State์™€ ์ƒ๋ช…์ฃผ๊ธฐ

๐Ÿค”State๋ž€?

๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ,๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ์˜ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ

๐Ÿ’ก

๋ Œ๋”๋ง์ด๋‚˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„์— ์‚ฌ์šฉ๋˜๋Š” ๊ฐ’๋งŒ state์— ํฌํ•จ์‹œ์ผœ์•ผ ํ•œ๋‹ค.

์™œ? state๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žฌ๋ Œ๋”๋ง ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ด ์ €ํ•˜๋œ๋‹ค.

๋”ฐ๋ผ์„œ ๋ Œ๋”๋ง๊ณผ ๋ฐ์ดํ„ฐ ํ๋ฆ„์— ๊ด€๋ จ ์žˆ๋Š” ๊ฐ’๋งŒ state์— ํฌํ•จํ•˜๋„๋ก ํ•˜๋ฉฐ

๊ทธ ์™ธ๋Š” ์ปดํฌ๋„ŒํŠธ ์ธ์Šคํ„ด์Šค์˜ ํ•„๋“œ๋กœ ์ •์˜ํ•œ๋‹ค

 

-ํŠน์ง•

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ฐ์ฒด

state๋ฅผ ์ƒ์„ฑ์ž์—์„œ ์ •์˜ํ•œ๋‹ค

 

์ง์ ‘์ ์ธ ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค -> setState()ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€๊ฒฝํ•œ๋‹ค.

 

์ƒ๋ช…์ฃผ๊ธฐ (ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ๋ช…์ฃผ๊ธฐ,Lifecycle method)

์ถœ์ƒ(mount)-> ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ์„ฑ์ž๊ฐ€ ์‹คํ–‰๋˜๋ฉฐ state๋ฅผ ์ •์˜ํ•œ๋‹ค, ๋ Œ๋”๋ง๋˜๋ฉฐ ์ดํ›„ componentDidMount() ํ˜ธ์ถœ

 

์ธ์ƒ(update)->์ปดํฌ๋„ŒํŠธ์˜ props๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ฑฐ๋‚˜ setState()ํ•จ์ˆ˜ ํ˜ธ์ถœ์— ์˜ํ•ด state๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ฑฐ๋‚˜

,forceUpdate()๋ผ๋Š” ๊ฐ•์ œ์—…๋ฐ์ดํŠธ ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ๋กœ ์ธํ•ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค์‹œ ๋ Œ๋”๋ง๋œ๋‹ค ๊ทธ๋ฆฌ๊ณ  componentDidUpdate() ํ˜ธ์ถœ

 

์‚ฌ๋ง(unmount)->์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ˜„์žฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋” ์ด์ƒ ํ™”๋ฉด์— ํ‘œ์‹œํ•˜์ง€ ์•Š๊ฒŒ ๋  ๋•Œ , ์ด๋•Œ componentWillUnmout()ํ˜ธ์ถœ

 

์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ณ„์† ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์‹œ๊ฐ„์˜ ํ๋ฆ„์—๋”ฐ๋ผ ์ƒ์„ฑ,์—…๋ฐ์ดํŠธ๊ทธ๋ฆฌ๊ณ  ์‚ฌ๋ผ์ง„๋‹ค.

 

์ปดํฌ๋„ŒํŠธ๋Š” prop์ด๋ผ๋Š” ์ž…๋ ฅ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๊ณ  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ด๊ฒƒ์„ ์ฒ˜๋ฆฌํ•ด return ๊ฐ’์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค
prop์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์™ธ๋ถ€์ž๋ฅผ ์œ„ํ•œ ๋ฐ์ดํ„ฐ
state๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๋‚ด๋ถ€์ž๋ฅผ ์œ„ํ•œ ๋ฐ์ดํ„ฐ

๊ฐ’์ด ๋ฐ”๋€Œ๋ฉด ์ƒˆ๋กœ์šด ๊ฐ’์ด ๋ฐ”๊ปด์„œ ์ด๊ฒƒ์ด UI์— ๋ฐ˜์˜๋˜๊ฒŒํ•˜๋Š”๊ฒƒ ์ด๋•Œ
state๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค
useState()๋Š” ๋ฐฐ์—ด์„ ๋ฆฌํ„ดํ•˜๊ณ ,
0๋ฒˆ์จฐ ๊ฐ’์€ ์ƒํƒœ์˜ ๊ฐ’, 1๋ฒˆ์งธ ๊ฐ’์€ ํ•จ์ˆ˜๋‹ค
๊ทธ ์ƒํƒœ์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์ฃผ๋Š” ํ•จ์ˆ˜๋‹ค!

์ฐธ๊ณ : ์ƒํ™œ์ฝ”๋”ฉ

 

 


7.ํ›…(Hook)

๋ฆฌ์•กํŠธ์˜ state์™€ ์ƒ๋ช…์ฃผ๊ธฐ ๊ธฐ๋Šฅ์— ๊ฐˆ๊ณ ๋ฆฌ๋ฅผ ๊ฑธ์–ด ์›ํ•˜๋Š” ์‹œ์ ์— ์ •ํ•ด์ง„ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰๋˜๋„๋ก ๋งŒ๋“  ๊ฒƒ

 

useState()

state๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ํ›…

ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—๋Š” state๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์‚ฌ์šฉํ•˜๋ ค๋ฉด useState()ํ›…์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

-์‚ฌ์šฉ๋ฒ•

const [๋ณ€์ˆ˜๋ช…,set๋ณ€์ˆ˜๋ช…]=useState(์ดˆ๊นƒ๊ฐ’);

 

useEffect()

์‚ฌ์ด๋“œ ์ดํŒฉํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ํ›…

์ƒ๋ช…์ฃผ๊ธฐ ํ•จ์ˆ˜๋“ค๊ณผ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

*์‚ฌ์ด๋“œ ์ดํŒฉํŠธ: ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๊ฑฐ๋‚˜ ์ˆ˜๋™์œผ๋กœ DOM์„ ๋ณ€๊ฒฝํ•˜๋Š” ์ž‘์—…

-์‚ฌ์šฉ๋ฒ•

useEffect(()=>{
	//์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ ๋œ ์ดํ›„,
    //์˜์กด์„ฑ ๋ฐฐ์—ด์— ์žˆ๋Š” ๋ณ€์ˆ˜๋“ค ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ ์‹คํ–‰๋จ
    //์˜์กด์„ฑ ๋ฐฐ์—ด์— ๋นˆ ๋ฐฐ์—ด์„ ๋„ฃ์œผ๋ฉด ๋งˆ์šดํŠธ์™€ ์–ธ๋งˆ์šดํŠธ ์‹œ์— ๋‹จ ํ•œ ๋ฒˆ ์”ฉ๋งŒ ์‹คํ–‰๋จ
    //์˜์กด์„ฑ ๋ฐฐ์—ด ์ƒ๋žต ์‹œ ์ปดํฌ๋„ŒํŠธ ์—…๋ฐ์ดํŠธ ์‹œ๋งˆ๋‹ค ์‹คํ–‰๋จ

	return()=>{
    	//์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ ํ•ด์ œ๋˜๊ธฐ ์ „์— ์‹คํ–‰๋จ
    }
},[์˜์กด์„ฑ ๋ณ€์ˆ˜1, ์˜์กด์„ฑ ๋ณ€์ˆ˜2,...]);

์˜์กด์„ฑ ๋ฐฐ์—ด ์•ˆ์— ์žˆ๋Š” ๋ณ€์ˆ˜ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„๋•Œ, ์ดํŽ™ํŠธ ํ•จ์ˆ˜ ์‹คํ–‰

์˜์กด์„ฑ ๋ฐฐ์—ด์— ๋นˆ ๋ฐฐ์—ด์„ ๋„ฃ์œผ๋ฉด ๋งˆ์šดํŠธ,์–ธ๋งˆ์šดํŠธ ์‹œ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋œ๋‹ค.

์˜์กด์„ฑ ๋ฐฐ์—ด ์ƒ๋žต์‹œ, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—…๋ฐ์ดํŠธ๋  ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ

์„ ์–ธ๋œ ์ปดํฌ๋„ŒํŠธ์˜ props์™€ state์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜๋Š” ์ปดํฌ๋„ŒํŠธ ๋งˆ์šดํŠธ๊ฐ€ ํ•ด์ œ๋  ๋•Œ ํ˜ธ์ถœ๋จ

 

useMemo()

useCallback()

useRef()

 

ํ›…์˜ ๊ทœ์น™

๋ฌด์กฐ๊ฑด ์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ์—์„œ๋งŒ ํ˜ธ์ถœํ•ด์•ผํ•œ๋‹ค (๋ฐ˜๋ณต๋ฌธ,์กฐ๊ฑด๋ฌธ,์ค‘์ฒฉํ•จ์ˆ˜ ์•ˆ์—์„œ ํ˜ธ์ถœํ•˜๋ฉด ์•ˆ๋จ)

์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง๋  ๋•Œ๋งˆ๋‹ค ๋งค๋ฒˆ ๊ฐ™์€ ์ˆœ์„œ๋กœ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•œ๋‹ค.

๋ฆฌ์•กํŠธ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ๋งŒ ํ›…์„ ํ˜ธ์ถœํ•ด์•ผํ•จ

 

์ปค์Šคํ…€ ํ›…

์ด๋ฆ„์€ use๋กœ ์‹œ์ž‘, ๊ทธ๋ ‡์ง€ ์•Š์„ ๊ฒฝ์šฐ ํ›…์˜ ๊ทœ์น™ ์œ„๋ฐ˜ ์—ฌ๋ถ€ ์ž๋™ํ™•์ธ ๋ถˆ๊ฐ€๋Šฅ

์ค‘๋ณต๋˜๋Š” ๋กœ์ง์„ ์ปค์Šคํ…€ ํ™ˆ์œผ๋กœ ์ถ”์ถœํ•˜์—ฌ ์žฌ์‚ฌ์šฉ์„ฑ ๋†’์ด๊ธฐ

 

์‹ค์Šต์ฝ”๋“œ

import React,{useEffect, useState} from "react";
import useCounter from "./useCounter";

const MAX_CAPACITY=10;

function Accommodate(props){
    const [isFull,setIsFull]=useState(false);
    const [count,increaseCount,decreaseCount]=useCounter(0);

    useEffect(()=>{
        console.log("=====================")
        console.log("useEffect() is called");
        console.log(`isFull:${isFull}`);
    });

    useEffect(()=>{
        setIsFull(count>=MAX_CAPACITY);
        console.log(`Current count value:${count}`);
    },[count]);

    return(
        <div style={{padding:16}}>
            <p>{`์ด ${count}๋ช… ์ˆ˜์šฉ์ค‘`}</p>
            <button onClick={increaseCount} disabled={isFull}>์ž…์žฅ</button>
            <button onClick={decreaseCount}>ํ‡ด์žฅ</button>

            {isFull && <p style={{color:"red"}}>์ •์›์ด ๊ฐ€๋“์ฐผ์Šต๋‹ˆ๋‹ค.</p>}
        </div>
    );
}

export default Accommodate;

 


8. ์ด๋ฒคํŠธ ํ•ธ๋“ค๋ง

 

์ด๋ฒคํŠธ๋ž€?

์‚ฌ์šฉ์ž๊ฐ€ ํ™”๋ฉด์—์„œ ํ•˜๋Š” ์‚ฌ๊ฑด์„ ์˜๋ฏธ (ex. ๋ฒ„ํŠผ ๋ˆ„๋ฅด๊ธฐ,์ž…๋ ฅ์ฐฝ์— ์ž…๋ ฅํ•˜๊ธฐ)

 

-์ฒ˜๋ฆฌ

DOM : ์ด๋ฒคํŠธ ์ด๋ฆ„์€ ๋ชจ๋‘ ์†Œ๋ฌธ์ž, ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•  ํ•จ์ˆ˜๋ฅผ ๋ฌธ์ž์—ด๋กœ ์ „๋‹ฌ

React: ์ด๋ฒคํŠธ ์ด๋ฆ„์€ ์นด๋ฉœ ํ‘œ๊ธฐ๋ฒ•,์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•  ํ• ์ˆ˜๋ฅผ ๊ทธ๋Œ€๋กœ ์ „๋‹ฌ

์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ : ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ํ•ด๋‹น ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜

 

Arguments๋ž€?

ํ•จ์ˆ˜์— ์ „๋‹ฌํ•  ๋ฐ์ดํ„ฐ, ํŒŒ๋ผ๋ฏธํ„ฐ ๋˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜

 

-ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ

arrow function์„ ์‚ฌ์šฉ ๋˜๋Š” bind์‚ฌ์šฉํ•˜์—ฌ ์ „๋‹ฌ

-ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ

์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ˜ธ์ถœ ์‹œ ์›ํ•˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋„ฃ์–ด์„œ ์‚ฌ์šฉ

 

์‹ค์Šต์ฝ”๋“œ

import React,{useState} from "react";

function ConfirmButton(props){
    const [isConfirmed,setIsConfirmed]=useState(false);

    const handleConfirm=()=>{
        setIsConfirmed((prevIsConfirmed)=>!prevIsConfirmed);
    };

    return(
        <button onClick={handleConfirm} disabled={isConfirmed}>
            {isConfirmed?"ํ™•์ธ๋จ":"ํ™•์ธํ•˜๊ธฐ"}
        </button>
    );
}

export default ConfirmButton;