๊ธฐ๋ณธ์ ์ผ๋ก Component์ ์ํ๋ ๊ฐ์ ๋๊ฒจ์ค ๋ ์ฌ์ฉํ๋ฉฐ, ๋๊ฒจ์ค ์ ์๋ ๊ฐ์ ๋ณ์, ํจ์, ๊ฐ์ฒด, ๋ฐฐ์ด ๋ฑ JavaScript์ ์์๋ผ๋ฉด ์ ํ์ด ์๋ค. ์ฃผ๋ก Component์ '์ฌ์ฌ์ฉ'์ ์ํ์ฌ ์ฌ์ฉํ๋ค.
{/*์ปดํฌ๋ํธ ์์ฑ*/} const Welcome = (props) => { return <h1>Hello, {props.name}</h1>; } {/*์ปดํฌ๋ํธ ์ฌ์ฉ*/} const App = () => { return ( <> <Welcome name='Alex'/> <Welcome name='Jason'/> <Welcome name='Justin'/> <Welcome name='Claire'/> ) }
props๋ ์ฝ๊ธฐ ์ ์ฉ(Read Only)
const Welcome = (props) => { const name = `{props.name} ๋`; return <h1>Hello, {name}</h1>; }
๋ง์ฝ Props์ ๊ฐ์ ๋ณ๊ฒฝํด์ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด, ์๋ก์ด ๋ณ์๋ฅผ ์์ฑํด์ ๊ฐ์ ๋ณต์ ํ๋ค.
๊ธฐ๋ณธ์ ์ธ DOM Element(div, span ๋ฑ)๋ค์ Attribute๋ camel case๋ก ์์ฑ. (tabIndex, className)
'data-' ํน์ 'aria-'๋ก ์์ํ๋ Attribute๋ ์์ธ์ด๋ค. (data-type, aria-label) p.s: 'aria-'๋ ์ ๊ทผ์ฑ๊ณผ ๊ด๋ จ๋ ์ค์ .
HTML์ Attribute์ ๋ค๋ฅธ ์ด๋ฆ์ ๊ฐ์ง๋ Attribute๊ฐ ์๋ค. (class -> className, for -> htmlFor)
HTML์ Attribute์ ๋ค๋ฅธ ๋์ ๋ฐฉ์์ ๊ฐ์ง Attribute๊ฐ ์๋ค. ( checked(defaultChecked), value(defaultValue), style )
React์์๋ง ์ฐ์ด๋ ์๋ก์ด Attribute๊ฐ ์๋ค. (key, dangerouslySetInnerHTML)
(<input type='checkbox' checked={false}/>)
HTML์์ checked ๋๋ value๋ ํด๋น ๊ฐ์ด '์ด๊ธฐ๊ฐ'์ผ๋ก ์ฐ์ด์ง๋ง, React ๋ด์์๋ ํ์ฌ ๊ฐ์ ์๋ฏธํ๋ค.
์๋ฅผ ๋ค์ด, checked ๊ฐ์ด false๋ก ๊ณ ์ ๋์๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ์๊ฐ checked๋ฅผ ํด๋ฆญํด๋ ๊ฐ์ ๋ณํ๊ฐ ์ผ์ด๋์ง ์๋๋ค.
๋ง์ฝ, '์ด๊ธฐ๊ฐ'์ ์๋ฏธ๋ก checked ๋๋ value๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ, defaultChecked, defaultValue Attribute๋ฅผ ์ค์ ํด์ผ ํ๋ค.
const Names = () => {
const names = [
{key: '1', value: 'Alex'},
{key: '2', value: 'Justin'},
{key: '3' value: 'Claire'},
];
return (
<div>
{names.map((item) => {
<li key={item.key}>{item.value}</li>
))};
</div>
)
};
Key๋ React๊ฐ ์ด๋ค ํญ๋ชฉ์ ๋ณ๊ฒฝ, ์ถ๊ฐ ๋๋ ์ญ์ ํ ์ง ์๋ณํ๋ ๊ฒ์ ๋๋๋ค.
Key๋ Element์ ์์ ์ ์ธ ๊ณ ์ ์ฑ์ ๋ถ์ฌํ๊ธฐ ์ํด ๋ฐฐ์ด ๋ด๋ถ์ Element์ ์ง์ ํด์ผ ํ๋ค.
Key๋ ๋ฐฐ์ด ์์์ ํ์ ์ฌ์ด์์ ๊ณ ์ ํด์ผ ํ์ง๋ง, ์ ์ฒด ๋ฒ์์์ ๊ณ ์ ํ ํ์๋ ์๋ค.
๋ ๊ฐ์ ๋ค๋ฅธ ๋ฐฐ์ด์ ๋ง๋ค ๋ ๋์ผํ key๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
State๋ Component ๋ด์์ ์ ๋์ ์ผ๋ก ๋ณํ ์ ์๋ ๊ฐ์ ์ ์ฅํ๋ค.
๊ฐ๋ฐ์๊ฐ ์๋ํ ๋์์ด๋ ์ฌ์ฉ์์ ์ ๋ ฅ์ ์ํด ์๋ก์ด ๊ฐ์ผ๋ก ๋ณํ ์ ๋ ์๋ค.
State ๊ฐ์ด ๋ณ๊ฒฝ๋๊ณ ์ฌ๋ ๋๋ง์ด ํ์ํ ๊ฒฝ์ฐ์ React๊ฐ ์๋์ผ๋ก ๊ณ์ฐํ์ฌ ๋ณ๊ฒฝ๋ ๋ถ๋ถ์ ๋ ๋๋งํ๋ค.
import {useState} from 'react';
function Example() {
const [count, setCount] = useState(0);
return (
<div>
<p>๋ฒํผ์ {count}๋ฒ ๋๋ ์ต๋๋ค.</p>
<button onClick={() => setCount(count +)}>
ํด๋ฆญ
</button>
</div>
);
}
import {useState} from 'react';
function Example() {
const [count, setCount] = useState(0);
return (
<div>
<p>๋ฒํผ์ {count}๋ฒ ๋๋ ์ต๋๋ค.</p>
<button onClick={() => {count = count + 1;}>
ํด๋ฆญ
</button>
</div>
);
}
State๊ฐ์ ์ง์ ๋ณ๊ฒฝํ๊ฒ ๋๋ฉด React๊ฐ Component๋ฅผ ๋ค์ ๋ ๋๋งํ ํ์ด๋ฐ์ ์์์ฐจ๋ฆฌ์ง ๋ชปํ๋ค.
๋ฐ๋์ setState ํจ์๋ฅผ ์ด์ฉํด ๊ฐ์ ๋ณ๊ฒฝํด์ผ ํ๋ค.
setState ํจ์๋ฅผ ํธ์ถํ ์, React์๊ฒ ๋ค์ ๋ ๋๋งํ๋ผ๋ ๋ช
๋ น์ด ๋ด๋ ค์ง๊ธฐ ๋๋ฌธ์ด๋ค.
setState๋ด์ ๋ณ๊ฒฝํ ๊ฐ์ ๋ฃ๊ธฐ
const [count,setCount] = useState(0); setCount(count+1);
setState์ ํจ์ ๋ฃ๊ธฐ
const [count,setCount] = useState(0); setCount((current) => { return current + 1 }
setState ํจ์์๋ ๋ณ๊ฒฝํ ๊ฐ์ ์ง์ ๋ฃ๋ ๋ฐฉ๋ฒ์ด ์๊ณ , ํจ์๋ฅผ ๋ฃ๋ ๋ฐฉ๋ฒ ๋ ๊ฐ์ง๊ฐ ์๋ค.
ํจ์๋ฅผ ๋ฃ๋ ๊ฒฝ์ฐ ํจ์๊ฐ ๋ฐํ(return)ํ๋ ๊ฐ์ผ๋ก State๊ฐ ๋ณ๊ฒฝ๋๋ค.
ํ์ฌ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก State๋ฅผ ๋ณ๊ฒฝํ ๊ฒฝ์ฐ์๋ ํจ์๋ฅผ ๋ฃ๋ ๋ฐฉ๋ฒ์ด ๊ถ์ฅ๋๋ค.
const [user,setUser] = useState({name:'๋ฏผ์', grade: 1})
setUser((current) => {
current.grade = 2;
return current;
})
Object๋ฅผ ๊ฐ์ผ๋ก ๊ฐ๋ State๋ ๋ง๋ค ์ ์๋ค. ๊ทธ๋ฌ๋ ์์ ๊ฒฝ์ฐ React๊ฐ State์ ๋ณ๊ฒฝ์ ๊ฐ์งํ์ง ๋ชปํ๋ ๋ฌธ์ ๊ฐ ์๊ธด๋ค.
State์ ๊ฐ์ฒด์ ์์๊ฐ ๋ณ๊ฒฝ๋์์ง๋ง, State ์์ฒด๋ ๋ณ๊ฒฝ๋์ง ์์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋ผ์,
๊ฐ์ฒด ์์๋ฅผ ๋ด๋ object ์์ฒด๊ฐ ๋ณ๊ฒฝ๋์ง ์๋๋ค๋ฉด, React๊ฐ ๋ณํ๋ฅผ ๊ฐ์งํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์, ๊ธฐ์กด ๊ฐ์ฒด์ ๋ด์ฉ์ ์๋ก์ด object์ ๋ด์ ํ ๋ด์ฉ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์ณ์ ๋ฐฉ๋ฒ์ด๋ค.
const [user,setUser] = useState({name: '๋ฏผ์', grade: 1})
setUser((current) => {
//๊ฐ์ ๋ณต์ฌ
const newUser = {...current};
newUser.grade = 2;
return current;
})
์ด์ ๊ฐ์ด ํ์ฌ State์ ๊ฐ์ ๋ณต์ฌํ์ฌ ๋ง๋ ์๋ก์ด ๊ฐ์ฒด์ ๊ฐ์ ๋ณ๊ฒฝํ์ฌ ๊ฐ์ฒด๋ฅผ ํต์งธ๋ก ๋ฐํํด์ผ React๊ฐ ๋ณํ๋ฅผ ๊ฐ์งํ๊ณ ์ด๋ฅผ ํ๋ฉด์ ๋ฐ์ํด ์ค ์ ์๋ค.
ํ์ค ํ: ๋ฆฌ์กํธ๋ฅผ ํ์ฉํ ๊ฐ๋ฐ์ ์์ด ์ค์ํ ๊ธฐ๋ณธ ๊ฐ๋ ์ธ Props(์์ฑ์์)์ State(์ํ๊ฐ)์ ๋ํด ์ ๋๋ก ์ ๋ฆฌํ๋ ๊ฒ์ด ์ค์ํ๋ค๋ ๊ฒ์ ๊นจ๋ฌ์๋ค.