state : ๋ด๋ถ์์ ๋ณํํ๋ ๊ฐ / ex. ๋์ด, ํ์ฌ ์ฌ๋ ๊ณณ, ์ทจ์
์ฌ๋ถ...
Props : ์ธ๋ถ๋ก๋ถํฐ ์ ๋ฌ๋ฐ์ ๊ฐ / ex. ์ด๋ฆ, ์ฑ๋ณ...
State : ์ด๋ฉด์ ๋ณํ ์ ์๋ ๊ฐ = ์ํ
์ปดํฌ๋ํธ์ ์ฌ์ฉ ์ค ์ปดํฌ๋ํธ ๋ด๋ถ์์ ๋ณํ ์ ์๋ ๊ฐ
: ์ปดํฌ๋ํธ์ ์์ฑ(property), immutable
๋ถ๋ชจ ์ปดํฌ๋ํธ(์์ ์ปดํฌ๋ํธ)๋ก๋ถํฐ ์ ๋ฌ๋ฐ์ ๊ฐ
React ์ปดํฌ๋ํธ๋ JavaScript ํจ์์ ํด๋์ค๋ก, props๋ฅผ ํจ์์ ์ ๋ฌ์ธ์(argument)์ฒ๋ผ ์ ๋ฌ๋ฐ์ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉด์ ์ด๋ป๊ฒ ํ์๋๋์ง๋ฅผ ๊ธฐ์ ํ๋ React ์๋ฆฌ๋จผํธ ๋ฐํ => ์ปดํฌ๋ํธ๊ฐ ์ต์กฐ ๋ ๋๋ง ๋ ๋ ํ๋ฉด์ ์ถ๋ ฅํ๊ณ ์ ํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ด์ ์ด๊น๊ฐ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅ
ํจ๋ถ๋ก ๋ณ๊ฒฝ ๋ ์ ์๋ ์ฝ๊ธฐ ์ ์ฉ(read-only) ๊ฐ์ฒด
์ฝ๊ธฐ ์ ์ฉ ๊ฐ์ฒด๊ฐ ์๋๋ผ๋ฉด prop๋ฅผ ์ ๋ฌ๋ฐ์ ํ์ ์ปดํฌ๋ํธ ๋ด์์ props๋ฅผ ์ง์ ์์ ์ props๋ฅผ ์ ๋ฌํ ์์ ์ปดํฌ๋ํธ์ ๊ฐ์ ์ํฅ์ ๋ฏธ์น ์ ์๋ค. => React์ ๋จ๋ฐฉํฅ, ํํฅ์ ๋ฐ์ดํฐ ํ๋ฆ ์์น ์๋ฐฐ
ํ์ ์ปดํฌ๋ํธ์ ์ ๋ฌํ๊ณ ์ ํ๋ ๊ฐ(data)๊ณผ ์์ฑ์ ์ ์ํ๋ค.
JSX ์์ฑ๊ณผ ๊ฐ ํ ๋นํ๋ ๋ฐฉ๋ฒ : ์ ๋ฌํ๊ณ ์ ํ๋ ๊ฐ์ ์ค๊ดํธ{}
๋ก ๊ฐ์ธ์ค๋ค
<Child attribute={value}/>
props๋ฅผ ์ด์ฉํ์ฌ ์ ์๋ ๊ฐ๊ณผ ์์ฑ์ ์ ๋ฌํ๋ค.
props์ ์์ฑ์ ์ฌ๋ฌ ๊ฐ ์ง์ ๊ฐ๋ฅ
์ ๋ฌ๋ฐ์ props๋ฅผ ๋ ๋๋งํ๋ค.
props๋ ๊ฐ์ฒด์ด๊ณ , ์ด ๊ฐ์ฒด์ {key:value}
์ attribute={value}
์ ํํ๋ฅผ ๋ค๋ค.
JavaScript์์ ๊ฐ์ฒด์ value์ ์ ๊ทผํ ๋์ ๋์ผํ๊ฒ dot notaion ์ฌ์ฉ
// Parent ์ปดํฌ๋ํธ ์ ์ธ, ์์ Child ์ปดํฌ๋ํธ ์์ฑ
function Parent() {
return (
<div className="parent">
<h1>parent</h1>
// JSX ์์ฑ๊ณผ ๊ฐ ํ ๋นํ๋ ๋ฐฉ๋ฒ, ์ ๋ฌํ๊ณ ์ ํ๋ ๊ฐ์ ์ค๊ดํธ{}๋ก ๊ฐ์ธ์ค๋ค
<Child text={"I'm the eldest child"}/>
</div>
);
};
// Child ์ปดํฌ๋ํธ ์ ์ธ
function Child(props) { // props๊ฐ ํ์ํ ๋ชจ๋ ๋ฐ์ดํฐ ๊ฐ์ง๊ณ ์จ๋ค
return (
<div className="child">
// ์ ๋ฌ๋ฐ์ props ๋ ๋๋ง, dot notaion ์ฌ์ฉํด ๊ฐ์ฒด์ ๊ฐ์ ์ ๊ทผํ๋ค
<p>{props.text}</p>
</div>
);
};
props.children
props๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ : ์ฌ๋ ํ๊ทธ์ ๋ซ๋ ํ๊ทธ ์ฌ์ด์ value๋ฅผ ๋ฃ์ด ์ ๋ฌ
props.children
์ด์ฉํด ํด๋น value์ ์ ๊ทผํด ์ฌ์ฉ ๊ฐ๋ฅ
function Parent() {
return (
<div className="parent">
<h1>I'm the parent</h1>
<Child>I'm the eldest child</Child>
</div>
);
};
function Child(props) {
return (
<div className="child">
<p>{props.children}</p>
</div>
);
};
export default Parent;
: ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ
import
ํค์๋๋ก useState๋ฅผ ๋ถ๋ฌ์จ๋ค.import { useState } from "react";
useState๋ฅผ ์ปดํฌ๋ํธ ์์์ ํธ์ถํ๋ค.
useState๋ฅผ ํธ์ถํ๋ค = state๋ผ๋ ๋ณ์๋ฅผ ์ ์ธํ๋ค (๋ณ์ ์ด๋ฆ์ ์๊ดx)
์ผ๋ฐ์ ์ธ ๋ณ์๋ ํจ์๊ฐ ๋๋ ๋ ์ฌ๋ผ์ง์ง๋ง state ๋ณ์๋ React์ ์ํด ํจ์๊ฐ ๋๋๋ ์ฌ๋ผ์ง์ง ์๋๋ค.
useState๋ฅผ ํธ์ถํ๋ฉด ๋ฐฐ์ด์ ๋ฐํํ๋๋ฐ,
๋ฐฐ์ด์ 0๋ฒ์งธ ์์ = ํ์ฌ state ๋ณ์, 1๋ฒ์งธ ์์ = ์ด ๋ณ์๋ฅผ ๊ฐฑ์ ํ ์ ์๋ ํจ์
useState์ ์ธ์๋ก ๋๊ฒจ์ฃผ๋ ๊ฐ = state์ ์ด๊น๊ฐ
const [state ์ ์ฅ๋ณ์, state ๊ฐฑ์ ํจ์ ] = useState(์ํ ์ด๊น๊ฐ);
state ๊ฐฑ์ ํ๊ธฐ
import React, { useState } from "react";
function CheckboxExample() {
// ์๋ก์ด state ๋ณ์๋ฅผ ์ ์ธ, isChecked
// const [state ์ ์ฅ ๋ณ์, state ๊ฐฑ์ ํจ์] = useState(state ์ด๊น๊ฐ);
const [isChecked, setIsChecked] = useState(false);
const handleChecked = (event) => {
// state๋ฅผ ๊ฐฑ์ ํ๋ ค๊ณ state ๋ณ์๋ฅผ ๊ฐฑ์ ํ ์ ์๋ ํจ์์ธ setIsChecked ํธ์ถ
setIsChecked(event.target.checked);
};
return (
<div className="App">
<input type="checkbox" checked={isChecked} onChange={handleChecked}/>
// state ๋ณ์์ ์ ์ฅ๋ ๊ฐ์ ์ฌ์ฉํ๋ ค๋ฉด JSX ์๋ฆฌ๋จผํธ ์์ ์ง์ ๋ถ๋ฌ์ ์ฌ์ฉํ๋ค
<span>{isChecked ? "Checked!" : "Unchecked"}</span>
</div>
);
};
export default CheckboxExample;
React์ ์ด๋ฒคํธ ์ฒ๋ฆฌ(Event handling) ๋ฐฉ์์ DOM์ ์ด๋ฒคํธ ์ฒ๋ฆฌ ๋ฐฉ์๊ณผ ์ ์ฌํ๋ค.
๋จ, ์๋ ๋ช๊ฐ์ง ๋ฌธ๋ฒ ์ฐจ์ด๊ฐ ์๋ค.
<input>
, <textarea>
, <select>
์ ๊ฐ์ ํผ(Form) ์๋ฆฌ๋จผํธ๋ ์ฌ์ฉ์์ ์
๋ ฅ๊ฐ์ ์ ์ดํ๋๋ฐ ์ฌ์ฉ๋๋ค.
๋ณ๊ฒฝ๋ ์ ์๋ ์
๋ ฅ๊ฐ์ ์ผ๋ฐ์ ์ผ๋ก ์ปดํฌ๋ํธ์ state๋ก ๊ด๋ฆฌํ๊ณ ์
๋ฐ์ดํธ ํ๋ค.
onChange
: input์ ํ
์คํธ๊ฐ ๋ฐ๋ ๋๋ง๋ค ๋ฐ์ํ๋ ์ด๋ฒคํธ
์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ํด๋น ํจ์๊ฐ ์๋ํ๊ณ , ์ด๋ฒคํธ ๊ฐ์ฒด์ ๋ด๊ธด input
๊ฐ์ setState
๋ฅผ ํตํด ์๋ก์ด state๋ก ๊ฐฑ์ ํ๋ค.
import React, { useState } from "react";
function NameForm() {
const [name, setName] = useState("");
const handleChage = (e) => {
// `onChange` ์ด๋ฒคํธ ๋ฐ์ํ๋ฉด `e.target.value`๋ฅผ ํตํด ์ด๋ฒคํธ ๊ฐ์ฒด์ ๋ด๊ฒจ์๋ input ๊ฐ์ ์ฝ์ด์จ๋ค
setName(e.target.value);
}
return (
<div>
<input type="text" value={name} onChange={handleChage}></input>
<h1>{name}</h1>
</div>
)
};
export default NameForm;
onClick
: ์ฌ์ฉ์๊ฐ ํด๋ฆญ์ ํ์ ๋ ๋ฐ์ํ๋ ์ด๋ฒคํธ
๋ฒํผ์ด๋ <a>
ํ๊ทธ๋ฅผ ํตํ ๋งํฌ ์ด๋ ๋ฑ๊ณผ ๊ฐ์ด ์ฃผ๋ก ์ฌ์ฉ์์ ํ๋์ ๋ฐ๋ผ ์ ํ๋ฆฌ์ผ์ด์
์ด ๋ฐ์ํด์ผ ํ ๋ ์์ฃผ ์ฌ์ฉํ๋ ์ด๋ฒคํธ
import React, { useState } from "react";
function NameForm() {
const [name, setName] = useState("");
const handleChange = (e) => {
setName(e.target.value);
}
const handleClick = () => {
alert(name);
};
return (
<div>
<input type="text" value={name} onChange={handleChange}></input>
// ๋ฒํผ ํด๋ฆญ ์ input ํ๊ทธ์ ์
๋ ฅํ ์ด๋ฆ์ด alert์ ํตํด ์๋ฆผ ์ฐฝ์ด ํ์
๋๋๋ก ํ๋ค
<button onClick={handleClick}>Button</button>
{/* <button onClick={() => alert(name)}>Button</button> */}
<h1>{name}</h1>
</div>
);
};
export default NameForm;
onClick
์ด๋ฒคํธ์ ํจ์๋ฅผ ์ ๋ฌํ ๋, (ํจ์ ํธ์ถ x)
๋ฆฌํด๋ฌธ ์์์ ํจ์๋ฅผ ์ ์ํ๊ฑฐ๋, ๋ฆฌํด๋ฌธ ์ธ๋ถ์์ ํจ์ ์ ์ ํ ์ด๋ฒคํธ์ ํจ์ ์์ฒด๋ฅผ ์ ๋ฌํด์ผํ๋ค.
=> arrow function
์ ์ฌ์ฉํ์ฌ ํจ์๋ฅผ ์ ์ํด์ผ ํด๋น ์ปดํฌ๋ํธ๊ฐ ๊ฐ์ง state์ ํจ์ ์ ๊ทผ ๊ฐ๋ฅํ๋ค.
React๋ ํ์ด์ง ๋จ์๊ฐ ์๋ ์ปดํฌ๋ํธ ๋จ์๋ก ๊ฐ๋ฐ์ ์์ํ๋ค.
์ํฅ์(bottom-up)์ผ๋ก ์ฑ์ ๋ง๋ ๋ค.
ํ
์คํธ๊ฐ ์ฝ๊ณ , ํ์ฅ์ฑ์ด ์ข๋ค (์ปดํฌ๋ํธ ๊ณ์ธต ๊ตฌ์กฐ๋ก ๋๋๋ ๊ฒ์ด ์ ์ผ ๋จผ์ ํด์ผํ ์ผ)
ํ๋์ ์ปดํฌ๋ํธ๋ ํ ๊ฐ์ง ์ผ๋ง ํ๋ค. (๋จ์ผ ์ฑ ์ ์์น)
๋ฐ์ดํฐ๋ ์์์ ์๋๋ก ํ๋ฅธ๋ค.
์ปดํฌ๋ํธ ๋ฐ๊นฅ์์ props๋ฅผ ์ด์ฉํด ๋ฐ์ดํฐ๋ฅผ ์ธ์(arguments) ๋๋ ์์ฑ(attributes)์ฒ๋ผ ์ ๋ฌ ๋ฐ์ ์ ์๋ค.
๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ์ฃผ์ฒด๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ๋๋ค. => ํํฅ์(top-down) ๋ฐ์ดํฐ ํ๋ฆ
React ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ(one-way data flow)์ ๋ฐ๋ฅธ๋ค.
- ์ํ(state) ์์น ์ ํ๊ธฐ
๋ ๊ฐ์ ์์ ์ปดํฌ๋ํธ๊ฐ ํ๋์ ์ํ์ ์ ๊ทผํ๊ณ ์ ํ ๋,
๊ณต๋ ์์ ์ปดํฌ๋ํธ(๊ณตํต์ ๋ถ๋ชจ)๋ฅผ ์ฐพ์ ๊ทธ ๊ณณ์ ์ํ๋ฅผ ์์นํด์ผ ํ๋ค.
๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋, ์ปดํฌ๋ํธ๋ค ๊ฐ์ ์ํธ ๊ด๊ณ์ ๋ฐ์ดํฐ์ ์ญํ , ๋ฐ์ดํฐ์ ํ๋ฆ์ ๊ณ ๋ คํด ์์น๋ฅผ ์ค์ ํด์ผ ํ๋ค.