๐ธ ์ปดํฌ๋ํธ์ ์์ฑ(property). ๋ถ๋ชจ ์ปดํฌ๋ํธ(์์ ์ปดํฌ๋ํธ)๋ก๋ถํฐ ์ ๋ฌ๋ฐ์ ๊ฐ์ผ๋ก ๋ณํ์ง ์์.
๐ธ Props๋ฅผ ํจ์์ ์ ๋ฌ์ธ์(arguments)์ฒ๋ผ ์ ๋ฌ๋ฐ๊ณ , ์ด๋ฅผ ํ๋ฉด์ ์ด๋ป๊ฒ ํ์๋๋์ง๋ฅผ ๊ธฐ์ ํ๋ React ์๋ฆฌ๋จผํธ๋ฅผ ๋ฐํ. ์ปดํฌ๋ํธ๊ฐ ์ต์ด ๋ ๋๋ง ๋ ๋ ํ๋ฉด์ ์ถ๋ ฅํ๊ณ ์ ํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ด์ ์ด๊น๊ฐ์ผ๋ก ์ฌ์ฉ๊ฐ๋ฅ.
๐ธ ์ด๋ค ํ์ ์ ๊ฐ๋ ๋ฃ์ ์ ์๋ ๊ฐ์ฒด ํํ.
๐ธ ํจ๋ถ๋ก ๋ณ๊ฒฝ๋ ์ ์๋ ์ฝ๊ธฐ ์ ์ฉ(read-only) ๊ฐ์ฒด.
๐ก ์ฝ๊ธฐ ์ ์ฉ ๊ฐ์ฒด๊ฐ ์๋๋ผ๋ฉด props๋ฅผ ์ ๋ฌ๋ฐ์ ํ์ ์ปดํฌ๋ํธ ๋ด์์ props๋ฅผ ์ง์ ์์ ์ props๋ฅผ ์ ๋ฌํ ์์ ์ปดํฌ๋ํธ์ ๊ฐ์ ์ํฅ์ ๋ฏธ์นจ. ์ด๋ ๋จ๋ฐฉํฅ, ํํฅ์ ๋ฐ์ดํฐ ํ๋ฆ ์์น(React is all about one-way data flow down the component hierarchy) ์ ์๋ฐฐ๋จ.
1 . ํ์ ์ปดํฌ๋ํธ์ ์ ๋ฌํ๊ณ ์ ํ๋ ๊ฐ(data)๊ณผ ์์ฑ์ ์์ ์ปดํฌ๋ํธ์ ์ ์
๐ธ ์ฐ์ <Parent>
์ <Child>
๋ผ๋ ์ปดํฌ๋ํธ๋ฅผ ์ ์ธํ๊ณ , <Parent>
์ปดํฌ๋ํธ ์์ <Child>
์ปดํฌ๋ํธ๋ฅผ ์์ฑ.
๐ธ ๋ฐฉ๋ฒ 1) <Child attribute={value} />
: ์ ๋ฌํ๊ณ ์ ํ๋ ๊ฐ์ ์ค๊ดํธ {}
๋ฅผ ์ด์ฉํด ๊ฐ์.
๐ธ ๋ฐฉ๋ฒ 2) <Child>value</Child>
: ์ฌ๋ ํ๊ทธ์ ๋ซ๋ ํ๊ทธ์ ์ฌ์ด์ value๋ฅผ ๋ฃ์ด ์ ๋ฌ.
2. props๋ฅผ ์ด์ฉํ์ฌ ์ ์๋ ๊ฐ๊ณผ ์์ฑ์ ์ ๋ฌ
3. ํ์ ์ปดํฌ๋ํธ์์ ์ ๋ฌ๋ฐ์ ๊ฐ์ ๋๋๋ง
๐ธ props๋ ๊ฐ์ฒด์ด๋ฏ๋ก <Parent>
์ปดํฌ๋ํธ์์ ์ ์ํ value๋ { attribute : value }
์ ํํ๋ฅผ ๋.
๐ธ ๋ฐฉ๋ฒ 1) dot notation์ ์ฌ์ฉํ์ฌ props์ value์ ์ ๊ทผ
๐ธ ๋ฐฉ๋ฒ 2) props.children
์ ์ด์ฉํด ํด๋น value์ ์ ๊ทผ
function Parent() {
return (
<div className="parent">
<h1>I'm the parent</h1>
// 1-1. attribute={value}
<Child text={"I'm the eldest child"} />
// 1-2. tag ์ฌ์ด์ ์
๋ ฅ
<Child>hi</Child>
</div>
);
};
// 2. props ์ ๋ฌ
function Child(props) {
return (
<div className="child"></div>
// 3-1. dot notation์ผ๋ก key๋ฅผ ์
๋ ฅํ์ฌ value๋ฅผ ๋ถ๋ฌ์ด.
<p>{props.text}</p>
// 3-2. props.children์ผ๋ก ์ ์ฒด values๋ฅผ ๋ถ๋ฌ์ด.
<p>{props.children}</p>
);
};
๐ธ ์ปดํฌ๋ํธ ๋ด๋ถ์์ ๋ณํ ์ ์๋ ๊ฐ(์ํ)์ผ๋ก, ์ํ๋ React state๋ก ๋ค๋ค์ผ ํจ.
1. useState
๋ฅผ ์ด์ฉํ๊ธฐ ์ํด์๋ React๋ก๋ถํฐ useState
๋ฅผ ๋ถ๋ฌ์์ผ ํจ. import
ํค์๋๋ก useState
๋ฅผ ๋ถ๋ฌ์ด.
import { useState } from "react";
2. useState
๋ฅผ ์ปดํฌ๋ํธ ์์์ ํธ์ถ(= "state"๋ผ๋ ๋ณ์๋ฅผ ์ ์ธ). (๋ณ์์ ์ด๋ฆ์ ์๋ฌด ์ด๋ฆ์ผ๋ก ์ง๊ธฐ ๊ฐ๋ฅ)
๐ก์ผ๋ฐ์ ์ธ ๋ณ์๋ ํจ์๊ฐ ๋๋ ๋ ์ฌ๋ผ์ง์ง๋ง, state ๋ณ์๋ React์ ์ํด ํจ์๊ฐ ๋๋๋ ์ฌ๋ผ์ง์ง ์์.
function CheckboxExample() {
// ์๋ก์ด state ๋ณ์๋ฅผ ์ ์ธํ๊ณ , ์ฌ๊ธฐ์๋ ์ด๊ฒ์ isChecked๋ผ ๋ถ๋ฆ.
const [isChecked, setIsChecked] = useState(false); // 1๋ฒ
}
const stateHookArray = useState(false); // 1๋ฒ ์ฝ๋๋ฅผ ํ์ด์ฐ๋ฉด ์ด์ ๊ฐ์.
const isChecked = stateHookArray[0];
const setIsChecked = stateHookArray[1];
3. useState
๋ฅผ ํธ์ถํ๋ฉด ๋ฐฐ์ด์ ๋ฐํ, ๋ฐฐ์ด์ 0๋ฒ์งธ ์์๋ ํ์ฌ state ๋ณ์์ด๊ณ , 1๋ฒ์งธ ์์๋ ์ด ๋ณ์๋ฅผ ๊ฐฑ์ ํ ์ ์๋ ํจ์. useState
์ ์ธ์๋ก ๋๊ฒจ์ฃผ๋ ๊ฐ์ state์ ์ด๊น๊ฐ.
const [state ์ ์ฅ ๋ณ์, state ๊ฐฑ์ ํจ์] = useState(์ํ ์ด๊ธฐ ๊ฐ);
4. ์ด state ๋ณ์์ ์ ์ฅ๋ ๊ฐ์ ์ฌ์ฉํ๋ ค๋ฉด JSX ์๋ฆฌ๋จผํธ ์์ ์ง์ ๋ถ๋ฌ์ ์ฌ์ฉ๊ฐ๋ฅ. ์ฌ๊ธฐ์๋ isChecked
๊ฐ boolean ๊ฐ์ ๊ฐ์ง๊ธฐ ๋๋ฌธ์ true
or false
์ฌ๋ถ์ ๋ฐ๋ผ ๋ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ ๋ณด์ด๋๋ก ์ผํญ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํจ.
<span>{isChecked ? "Checked!!" : "Unchecked"}</span>
function CheckboxExample() {
const [isChecked, setIsChecked] = useState(false);
const handleChecked = (event) => {
setIsChecked(event.target.checked); // ์ฒดํฌ ๋ฐ์ค์ ์ฒดํฌ ์ํ๋ฅผ ๋ํ๋
};
return (
<div className="App">
<input type="checkbox" checked={isChecked} onChange={handleChecked} />
// ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด onChange์ ํจ์ handleChecked ํธ์ถ๋๊ณ event.target.checked ๊ฐ์ ๋ฐ๋ผ ์ฒดํฌ๋ฐ์ค์ ์๋ก์ด ์ฒดํฌ ์ํ๋ฅผ ๋ํ๋.
//checked ์์ฑ์ isChecked ๋ณ์์ ๊ฐ์ผ๋ก ์ค์ .
<span>{isChecked ? "Checked!!" : "Unchecked"}</span>
</div>
);
}
- state ๋ณ์๋ฅผ ๊ฐฑ์ ํ ์ ์๋ ํจ์์ธ
setIsChecked
๋ฅผ ํธ์ถํ์ฌ state๋ฅผ ๊ฐฑ์ .- ์์์ ๊ฒฝ์ฐ,
input[type=checkbox]
JSX ์๋ฆฌ๋จผํธ์ ๊ฐ ๋ณ๊ฒฝ์ ๋ฐ๋ผ์isChecked
๊ฐ ๋ณ๊ฒฝ๋์ด์ผ ํจ. ๋ธ๋ผ์ฐ์ ์์checked
๋ก ๊ฐ์ด ๋ณ๊ฒฝ๋์๋ค๋ฉด, React์isChecked
๋ ๋ณ๊ฒฝ๋จ.- ์ฌ์ฉ์๊ฐ ์ฒดํฌ๋ฐ์ค ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด
onChange
์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๊ณ , ์ด๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ ํจ์์ธhandleChecked
๋ฅผ ํธ์ถํ๊ณ , ์ด ํจ์๊ฐsetIsChecked
๋ฅผ ํธ์ถํ๊ฒ ๋จ.setIsChecked
๊ฐ ํธ์ถ๋๋ฉด ํธ์ถ๋ ๊ฒฐ๊ณผ์ ๋ฐ๋ผisChecked
๋ณ์๊ฐ ๊ฐฑ์ ๋๋ฉฐ, React๋ ์๋ก์ดisChecked
๋ณ์๋ฅผCheckboxExample
์ปดํฌ๋ํธ์ ๋๊ฒจ ํด๋น ์ปดํฌ๋ํธ๋ฅผ ๋ค์ ๋ ๋๋ง.
๐ก ์ฃผ์ !
- React ์ปดํฌ๋ํธ๋ state๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์๋กญ๊ฒ ํธ์ถ๋๊ณ , ๋ฆฌ๋ ๋๋ง ๋จ.
- React state๋ ์ํ ๋ณ๊ฒฝ ํจ์ ํธ์ถ๋ก ๋ณ๊ฒฝํด์ผ ํจ. (์ํ ๋ณ๊ฒฝ ํจ์ ์ฌ์ฉ์ React์ ๊ฐ๋ฐ์์ ์ฝ์. ๊ฐ์ ๋ก ๋ณ๊ฒฝ์ ์๋ํ๋ฉด, ๋ฆฌ๋ ๋๋ง์ด ๋์ง ์๋๋ค๊ฑฐ๋, state๊ฐ ์ ๋๋ก ๋ณ๊ฒฝ๋์ง ์์.)
- ์์ :
state.push(1);
,state[1] = 2;
,state = 'wrong state';
๐ธ React์ ์ด๋ฒคํธ ์ฒ๋ฆฌ(Event handling) ๋ฐฉ์์ DOM์ ์ด๋ฒคํธ ์ฒ๋ฆฌ ๋ฐฉ์๊ณผ ์ ์ฌ.
๐ธ React์์ ์ด๋ฒคํธ๋ ์๋ฌธ์ ๋์ ์นด๋ฉ ์ผ์ด์ค(camelCase)๋ฅผ ์ฌ์ฉ.
๐ธ JSX๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด์ด ์๋ ํจ์๋ก ์ด๋ฒคํธ ์ฒ๋ฆฌ ํจ์(์ด๋ฒคํธ ํธ๋ค๋ฌ; Event handler)๋ฅผ ์ ๋ฌ.
<button onclick="handleEvent()">Event</button> // HTML
<button onClick={handleEvent}>Event</button> //React
๐ธ <input>
<textarea>
<select>
์ ๊ฐ์ ํผ(Form) ์๋ฆฌ๋จผํธ๋ ์ฌ์ฉ์์ ์
๋ ฅ๊ฐ์ ์ ์ดํ๋ ๋ฐ ์ฌ์ฉ๋จ. React์์๋ ์ด๋ฌํ ๋ณ๊ฒฝ๋ ์ ์๋ ์
๋ ฅ๊ฐ์ ์ผ๋ฐ์ ์ผ๋ก ์ปดํฌ๋ํธ์ state๋ก ๊ด๋ฆฌํ๊ณ ์
๋ฐ์ดํธ.
๐ธ onChange
์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด e.target.value
๋ฅผ ํตํด ์ด๋ฒคํธ ๊ฐ์ฒด์ ๋ด๊ฒจ์๋ input
๊ฐ์ ์ฝ์ด์ฌ ์ ์์.
๐ธ ์ปดํฌ๋ํธ return ๋ฌธ ์์ input
ํ๊ทธ์ value
์ onChange
๋ฅผ ๋ฃ์ด์ค.
๐ธ onChange
๋ input
์ ํ
์คํธ๊ฐ ๋ฐ๋ ๋๋ง๋ค ๋ฐ์ํ๋ ์ด๋ฒคํธ. ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด handleChange
ํจ์๊ฐ ์๋ํ๋ฉฐ, ์ด๋ฒคํธ ๊ฐ์ฒด์ ๋ด๊ธด input
๊ฐ์ setState
๋ฅผ ํตํด ์๋ก์ด state
๋ก ๋ณ๊ฒฝํจ.
function NameForm() {
const [name, setName] = useState("");
const handleChange = (e) => {
setName(e.target.value);
}
return (
<div>
<input type="text" value={name} onChange={handleChange}></input>
<h1>{name}</h1>
</div>
)
};
๐ธ ์ฌ์ฉ์๊ฐ ํด๋ฆญ์ด๋ผ๋ ํ๋์ ํ์์ ๋ ๋ฐ์ํ๋ ์ด๋ฒคํธ๋ก ๋ฒํผ์ด๋ <a>
tag๋ฅผ ํตํ ๋งํฌ ์ด๋ ๋ฑ๊ณผ ๊ฐ์ด ์ฃผ๋ก ์ฌ์ฉ์์ ํ๋์ ๋ฐ๋ผ ์ ํ๋ฆฌ์ผ์ด์
์ด ๋ฐ์ํด์ผ ํ ๋ ์์ฃผ ์ฌ์ฉํ๋ ์ด๋ฒคํธ.
๐ธ ์) ๋ฒํผ ํด๋ฆญ ์ input
tag์ ์
๋ ฅํ ์ด๋ฆ์ด alert์ ํตํด ์๋ฆผ ์ฐฝ์ด ํ์
๋๋๋ก ์ฝ๋๋ฅผ ์ถ๊ฐ
function SomethingForm() {
const [name, setName] = useState('');
const handleClick = () => { alert(name); };
return (
<div>
// ๐ 1. ํจ์ ์ ์
<button onClick={() => alert(name)}></button>
// ๐ 2. ํจ์ ์์ฒด ์ ๋ฌ
<button onClick={handleClick}></button>
</div>
);
};
๐ก
onClick
์ด๋ฒคํธ์alert(name)
ํจ์๋ฅผ ๋ฐ๋ก ํธ์ถํ๋ฉด ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง ๋ ๋ ํจ์ ์์ฒด๊ฐ ์๋ ํจ์ ํธ์ถ์ ๊ฒฐ๊ณผ๊ฐonClick
์ ์ ์ฉ๋จ.- ๋๋ฌธ์ ๋ฒํผ์ ํด๋ฆญํ ๋๊ฐ ์๋, ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง ๋ ๋๋ง๋ค alert์ด ์คํ๋์ด ๋ฒํผ์ ํด๋ฆญํ๊ธฐ๋ ์ ์ alert ์ฐฝ์ด ํ์๋จ.
- ์ด๋ ํจ์๋ ๋ฆฌํด ๊ฐ์ด ์์ ๋
undefined
๋ฅผ ๋ฐํํ๋ฏ๋กonClick
์ ์ ์ฉ๋์ด ํด๋ฆญํ์ ๋ ์๋ฌด๋ฐ ๊ฒฐ๊ณผ๋ ์ผ์ด๋์ง ์์.- ๋ฐ๋ผ์
onClick
์ด๋ฒคํธ์ ํจ์๋ฅผ ์ ๋ฌํ ๋๋ ํจ์๋ฅผ ํธ์ถํ๋ ๊ฒ์ด ์๋๋ผ ๋ฆฌํด๋ฌธ ์์์ํจ์๋ฅผ ์ ์
ํ๊ฑฐ๋ ๋ฆฌํด๋ฌธ ์ธ๋ถ์์ ํจ์๋ฅผ ์ ์ ํ ์ด๋ฒคํธ์ํจ์ ์์ฒด๋ฅผ ์ ๋ฌ
ํด์ผ ํจ.// ํจ์ ์ ์ํ๊ธฐ return ( <div> ... <button onClick={() => alert(name)}>Button</button> ... </div> ); }; // ํจ์ ์์ฒด๋ฅผ ์ ๋ฌํ๊ธฐ const handleClick = () => { alert(name); }; return ( <div> ... <button onClick={handleClick}>Button</button> ... </div> ); };
๐ธ React๊ฐ state๋ฅผ ํต์ ํ ์ ์๋ ์ปดํฌ๋ํธ
๐ธ ํต์ ํ๋ ๋ฒ์ input์ ๊ฐ ์ ๋ ฅ ์, state๋ ์ฆ์ ๋ฐ๋๊ณ (onChange) ์ด ๋ณ๊ฒฝ๋ state์ input์ value ๋ํ ๊ฐ๊ฒ ์์ฑํด์ผ ํ๋ฉด ๋จ.
๐ธ input์ value ๋ณ๊ฒฝ์ ๋ฐ๋ผ React์ state๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒ.
๐ธ React์ ๊ฐ๋ฐ ๋ฐฉ์์ ๊ฐ์ฅ ํฐ ํน์ง์ ํ์ด์ง ๋จ์๊ฐ ์๋, ์ปดํฌ๋ํธ ๋จ์๋ก ์์ํ๋ค๋ ์ . ์ฑ์ ํ๋กํ ํ์
์์ ๋จผ์ ์ปดํฌ๋ํธ๋ฅผ ์ฐพ์์ผ ํจ.
๐ธ ๋จผ์ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค๊ณ , ๋ค์ ํ์ด์ง๋ฅผ ์กฐ๋ฆฝ
๐ธ ์ฆ, ์ํฅ์(bottom-up)์ผ๋ก ์ฑ์ ๋ง๋ฆ (์ด๊ฒ์ ๊ฐ์ฅ ํฐ ์ฅ์ ์ ํ
์คํธ๊ฐ ์ฝ๊ณ ํ์ฅ์ฑ์ด ์ข์). ๊ธฐํ์๋ PM, ๋๋ UX ๋์์ด๋๋ก๋ถํฐ ์ฑ์ ๋์์ธ์ ์ ๋ฌ๋ฐ๊ณ ๋๋ฉด, ์ด๋ฅผ ์ปดํฌ๋ํธ ๊ณ์ธต ๊ตฌ์กฐ๋ก ๋๋๋ ๊ฒ์ด ๊ฐ์ฅ ๋จผ์ ํด์ผ ํ ์ผ.
๐ธ ๋จ์ผ ์ฑ
์ ์์น : ํ๋์ ์ปดํฌ๋ํธ๋ ํ ๊ฐ์ง ์ผ๋ง ํด์ผํจ.
๐ธ ์ปดํฌ๋ํธ๋ ์ปดํฌ๋ํธ ๋ฐ๊นฅ์์ props๋ฅผ ์ด์ฉํด ๋ฐ์ดํฐ๋ฅผ ๋ง์น ์ธ์(arguments) ํน์ ์์ฑ(attributes)์ฒ๋ผ ์ ๋ฌ๋ฐ์ ์ ์์. ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ์ฃผ์ฒด๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ๋๋ฉฐ, ์ด๋ ํ๋ฆ์ด ํํฅ์(top-down)์ผ๋ก ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ(one-way data flow).
๐ธ ์ปดํฌ๋ํธ๋ props๋ฅผ ํตํด ์ ๋ฌ๋ฐ์ ๋ฐ์ดํฐ๊ฐ ์ด๋์ ์๋์ง ์ ํ ์์ง ๋ชปํจ.
๐ธ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ํ๋ก ๋ ํ์๋ ์์ผ๋ฉฐ ์ํ๋ ์ต์ํํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์. ์ํ๊ฐ ๋ง์์ง์๋ก ์ ํ๋ฆฌ์ผ์ด์
์ ๋ณต์กํด์ง. ์ํ๋ ๋ค์ ์ธ ๊ฐ์ง๋ฅผ ์ถฉ์กฑ.
๐ธ ์ํ์ ์์น