elice/WIL

[week_08] React ๊ธฐ์ดˆ โ… (3) Props์™€ State

1. Props

๊ธฐ๋ณธ์ ์œผ๋กœ Component์— ์›ํ•˜๋Š” ๊ฐ’์„ ๋„˜๊ฒจ์ค„ ๋•Œ ์‚ฌ์šฉํ•˜๋ฉฐ, ๋„˜๊ฒจ์ค„ ์ˆ˜ ์žˆ๋Š” ๊ฐ’์€ ๋ณ€์ˆ˜, ํ•จ์ˆ˜, ๊ฐ์ฒด, ๋ฐฐ์—ด ๋“ฑ JavaScript์˜ ์š”์†Œ๋ผ๋ฉด ์ œํ•œ์ด ์—†๋‹ค. ์ฃผ๋กœ Component์˜ ์žฌ์‚ฌ์šฉ์„ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

/* 1. ์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ */
const Welcome = (props) => {
	return <h1>Hello, {props.name}</h1>
}


/* 2. ์ปดํฌ๋„ŒํŠธ ์‚ฌ์šฉ */
const App = () => {
	return <div>
    	<Welcome name="์ˆ˜์˜" />
        <Welcome name="๋ฏผ์ˆ˜" />
        <Welcome name="์˜ํฌ" />
    </div>;
}

Props๋Š” ์ฝ๊ธฐ ์ „์šฉ์ด๋‹ค. ๋”ฐ๋ผ์„œ, Props ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์„œ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด Props์˜ ๊ฐ’์„ ์ž„์˜๋กœ ๋ณ€๊ฒฝํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•ด์„œ ํ•ด๋‹น ๊ฐ’์„ ๋ณต์ œํ•œ ๋’ค ์›ํ•˜๋Š” ๋Œ€๋กœ ๋ณ€๊ฒฝํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.

1-1. DOM Element์˜ Attributes

  • ๊ธฐ๋ณธ์ ์ธ DOM Element(div, span ๋“ฑ)๋“ค์˜ Attribute๋Š” camel case๋กœ ์ž‘์„ฑํ•œ๋‹ค.
    • ์˜ˆ) tabIndex, className ๋“ฑ
  • ๊ทธ๋Ÿฌ๋‚˜ 'data-' ๋˜๋Š” 'aria-'๋กœ ์‹œ์ž‘ํ•˜๋Š” Attribute๋Š” ์˜ˆ์™ธ๋‹ค.
    • ์˜ˆ) data-type, aria-label ๋“ฑ
  • HTML์˜ Attribute์™€ ๋‹ค๋ฅธ ์ด๋ฆ„์„ ๊ฐ€์ง€๋Š” Attribute๊ฐ€ ์žˆ๋‹ค.
    • ์˜ˆ) class โžก className, for โžก htmlFor ๋“ฑ
  • HTML์˜ Attribute์™€ ๋‹ค๋ฅธ ๋™์ž‘ ๋ฐฉ์‹์„ ๊ฐ€์ง„ Attribute๊ฐ€ ์žˆ๋‹ค.
    • ์˜ˆ) checked(defaultChecked), value(defaultValue), style ๋“ฑ
    • HTML์—์„œ checked ๋˜๋Š” value๋Š” ํ•ด๋‹น ๊ฐ’์ด ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ ์“ฐ์ด์ง€๋งŒ, React์—์„œ๋Š” ํ˜„์žฌ ๊ฐ’์„ ์˜๋ฏธํ•œ๋‹ค.
    • ๋”ฐ๋ผ์„œ ์ดˆ๊ธฐ๊ฐ’์˜ ์˜๋ฏธ๋กœ checked๋‚˜ value๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, default~~๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.
  • React์—์„œ๋งŒ ์“ฐ์ด๋Š” ์ƒˆ๋กœ์šด Attribute๊ฐ€ ์žˆ๋‹ค.
    • ์˜ˆ) key, dangerouslySetInnerHTML ๋“ฑ
    • key๋Š” React๊ฐ€ ์–ด๋–ค ํ•ญ๋ชฉ์„ ๋ณ€๊ฒฝ, ์ถ”๊ฐ€ ๋˜๋Š” ์‚ญ์ œํ• ์ง€ ์‹๋ณ„ํ•˜๋Š” ๊ฒƒ์„ ๋•๋Š”๋‹ค.
    • key๋Š” Element์— ์•ˆ์ •์ ์ธ ๊ณ ์œ ์„ฑ์„ ๋ถ€์—ฌํ•˜๊ธฐ ์œ„ํ•ด ๋ฐฐ์—ด ๋‚ด๋ถ€์˜ Element์— ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.
    • key๋Š” ๋ฐฐ์—ด ๋‚ด์˜ ํ˜•์ œ ์‚ฌ์ด์—์„œ ๊ณ ์œ ํ•ด์•ผ ํ•˜๋‚˜, ์ „์ฒด ๋ฒ”์œ„์—์„œ ๊ณ ์œ ํ•  ํ•„์š”๋Š” ์—†๋‹ค.
    • ๋‘ ๊ฐœ์˜ ๋‹ค๋ฅธ ๋ฐฐ์—ด์„ ๋งŒ๋“ค ๋•Œ ๋™์ผํ•œ key๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

2. State

State๋Š” ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ์ง€์†์ ์œผ๋กœ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜๋Š” ๊ฐ’์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค. State๋Š” Component ๋‚ด์—์„œ ์œ ๋™์ ์œผ๋กœ ๋ณ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ์˜๋„ํ•œ ๋™์ž‘์— ์˜ํ•ด ๋ณ€ํ•  ์ˆ˜๋„ ์žˆ๊ณ , ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์— ๋”ฐ๋ผ ์ƒˆ๋กœ์šด ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝ๋  ์ˆ˜๋„ ์žˆ๋‹ค. State ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๊ณ  ์žฌ๋ Œ๋”๋ง์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— React๊ฐ€ ์ž๋™์œผ๋กœ ๊ณ„์‚ฐํ•˜์—ฌ ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„์„ ๋ Œ๋”๋งํ•œ๋‹ค. state๋ฅผ ๋ฐ”๊พธ๋ฉด ํ•จ์ˆ˜๊ฐ€ ๋‹ค์‹œ ์‹คํ–‰๋œ๋‹ค.

/* State์˜ ์„ ์–ธ */
import { useState } from "react";

const App = () => {
    const [value, setValue] = useState(์ดˆ๊ธฐ๊ฐ’);
    return ...
}
import { useState } from 'react';

function Example() {
	const [count, setCount] = useState(0);
    return (
    	<div>
        	<p>๋ฒ„ํŠผ์„ {count}๋ฒˆ ๋ˆŒ๋ €์Šต๋‹ˆ๋‹ค.</p>
            <button onClick={() => setCount(count + 1)}>ํด๋ฆญ</button>
        </div>
    );
}

2-1. State๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์œ ์˜ํ•  ์ 

1) State ๊ฐ’์„ ์ง์ ‘ ๋ณ€๊ฒฝํ•˜์ง€ ๋ง ๊ฒƒ

  • State ๊ฐ’์„ ์ง์ ‘ ๋ณ€๊ฒฝํ•˜๊ฒŒ ๋˜๋ฉด, React๊ฐ€ Component๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋งํ•  ํƒ€์ด๋ฐ์„ ์•Œ์•„์ฐจ๋ฆฌ์ง€ ๋ชปํ•˜๋ฏ€๋กœ ๋ฐ˜๋“œ์‹œ setState ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค.
  • setState ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ React์—๊ฒŒ '๋‹ค์‹œ ๋ Œ๋”๋ง ํ•ด์ฃผ์„ธ์š”' ๋ผ๋Š” ๋ช…๋ น์ด ๋‚ด๋ ค์ง„๋‹ค.
/* 1. setState์— ๋ณ€๊ฒฝํ•  ๊ฐ’์„ ๋„ฃ๊ธฐ */
const [count, setCount] = useState(0);
setCount(count + 1);


/* 2. setState์— ํ•จ์ˆ˜๋ฅผ ๋„ฃ๊ธฐ */
const [count, setCount] = useState(0);
setCount((current) => { // ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ˜„์žฌ count ๊ฐ’์„ ๋ฐ›๊ฒŒ ๋œ๋‹ค.
	return current + 1 // return ๊ฐ’์œผ๋กœ State๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค.
});
  • Object๋ฅผ ๊ฐ–๋Š” State๋ฅผ ๋งŒ๋“ค ๋•Œ ์ฃผ์˜์‚ฌํ•ญ
/* Object State์˜ ์ž˜๋ชป๋œ ์˜ˆ์‹œ */
const [user, setUser] = useState({name: "๋ฏผ์ˆ˜", grade: 1})
setUser((current) => {
	current.grade = 2;
    return current;
})

์œ„์™€ ๊ฐ™์ด Object๋ฅผ ๊ฐ’์œผ๋กœ ๊ฐ–๋Š” State๋„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋‚˜, ์œ„ ์˜ˆ์‹œ์˜ ๊ฒฝ์šฐ React๊ฐ€ State์˜ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•˜์ง€ ๋ชปํ•œ๋‹ค. user object ์•ˆ์˜ grade๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์ง€๋งŒ user ์ž์ฒด๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

/* Object State์˜ ์˜ฌ๋ฐ”๋ฅธ ์˜ˆ์‹œ */
const [user, setUser] = useState({name: "๋ฏผ์ˆ˜", grade: 1})
setUser((current) => {
	const newUser = { ...current } // ๊ธฐ์กด ๊ฐ’์„ spread๋กœ ๋ณต์‚ฌ
    newUser.grade = 2
    return newUser
})

๋”ฐ๋ผ์„œ, ๊ธฐ์กด user์˜ ๋‚ด์šฉ์„ ๋ณต์‚ฌํ•ด์„œ ์ƒˆ๋กœ์šด Object์— ๋‹ด๊ณ  grade๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค.

 

3. ๋ Œ๋”๋ง์ด ๋˜๋Š” ๊ฒฝ์šฐ

1) ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ๋์„ ๋•Œ
2) props์— ๋ณ€๊ฒฝ์ด ์ƒ๊ฒผ์„ ๋•Œ
3) state๊ฐ€ ๋ณ€๊ฒฝ๋์„ ๋•Œ