728x90
๋ฐ์ํ
๐ก ์ค์ต ํฌ์ธํธ!
- ์ด์ ์ ์ถ์ฒ ๋ฒํผ์ ํด๋ฆญํ๋ฉด ๋ฒํผ ์์ ์ซ์๊ฐ ์นด์ดํธ๋์ด ๋ณด์ฌ์ง๋ ๊ธฐ๋ฅ์ ๋ง๋ค์๋ค.
- ๊ทธ ๋๋ ๊ฐ์ฌ๋์ด ์์ ๋ก ํ๋์ ๊ฒ์๊ธ์๋ง ๊ธฐ๋ฅ ์ถ๊ฐํ๋ ๊ฒ์ ์๋ ค์ฃผ์ จ๋๋ฐ, ๊ทธ ๋ ๋ค๋ฅธ ๊ฒ์๊ธ์๋ ํด๋น ๊ธฐ๋ฅ์ ์ถ๊ฐํด๋ณด๋ ค ์๋๋ฅผ ํ๊ธฐ๋ ํ์๋ค.
- ํ์ง๋ง ๊ณต๋ถ๋์ด ๋ถ์กฑํด์์ธ์ง ๋ด๊ฐ ๋น์ฅ ๊ตฌํํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ฒซ๋ฒ์งธ ๊ฒ์๊ธ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ฒ๋ผ useState() ๋ฅผ ์๋ก ๋ง๋ค์ด์ ๋ค๋ฅธ ๊ฒ์๊ธ์๋ ์ ์ฉํ๋ ๊ฒ์ด์๋ค.
- ์ด๋ฌํ ๋ฐฉ๋ฒ์ ์ง๊ธ ๋น์ฅ์๋ ์ฌ์ฉํ ์ ์๊ฒ ์ง๋ง ๋ฐ์ดํฐ๊ฐ ๋ง์์ง๋ ๊ฒฝ์ฐ์๋ ๋ฌด์ํ ๋ง์ useState() ๊ฐ ํ์ํด์ง๊ธฐ ๋๋ฌธ์ ํ์ฅ์ฑ ๋ฑ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ ์ข์ง ์์ ์ฝ๋๊ฐ ๋๋ฏ๋ก ๊ณต๋ถ๋ฅผ ์ข ๋ ํ ๋ค์์ ์๋๋ฅผ ํ๋ ค๊ณ ๋ณด๋ฅํด๋ ์ํ์๋ค.
- ๊ทธ๋ฌ๊ณ ๋์ ๋ฐ์ดํฐ๋ฐ์ธ๋ฉํ๋ ๋ฐฉ๋ฒ๊น์ง ๋ฐฐ์ด ํ์ ์ด์ ๋ ๋ฐฐ์ด ๊ฒ๋ค์ ์ ์ฉํด์ ์์ ํ ์ ์์ ๊ฒ ๊ฐ์ ๋ค์ ์๋ํด๋ณด์๊ณ ์ด๋ฒ์๋ ์ ์์ ์ผ๋ก ๋๋ฅธ ๋ฒํผ๋ง ์นด์ดํธ๋๋๋ก ์ค๋ฅ๋ฅผ ์์ ํ ์ ์์๋ค.
๐ ์ถ์ฒ ๋ฒํผ ๊ธฐ๋ฅ ์ค๋ฅ ์์ ์
- ๋ฐ์ดํฐ๋ฐ์ธ๋ฉ๊น์ง ํ๊ณ ๋ ํ, ๊ธฐ์กด์ ์ฝ๋๋ ์์ ๊ฐ์ด ์ถ์ฒ ๋ฒํผ ํ๋๋ง ํด๋ฆญํด๋ ๋ชจ๋ ์ถ์ฒ๋ฒํผ์ด ๋๋ฌ์ง ๊ฒ์ฒ๋ผ ์นด์ดํธ๋๋ ํ์์ด ์์๋ค.
- ๋ด๊ฐ ์ํ๋ ๊ฑด ๊ฐ ์ถ์ฒ ๋ฒํผ์ ํด๋ฆญํ์ ๋, ๋ ๋ฆฝ์ ์ผ๋ก ํด๋ฆญํ ๋ฒํผ๋ง ์นด์ดํธ๋๋ ๊ฒ์ด์์ผ๋ฏ๋ก ์ฝ๋๋ฅผ ์์ ํด์ผํ ํ์๊ฐ ์์๋ค.
// ์ ์ฒด ์ฝ๋๊ฐ ๋๋ฌด ๊ธธ์ด์ ๋ถํ์ํ ์ฝ๋๋ ์ ์ธํ๋ค.
function App() {
let [title, setTitle] = useState([
'[React] React ์ค์น์ ๊ฐ๋ฐํ๊ฒฝ ์
ํ
ํ๊ธฐ',
'[React] JSX ๋ฅผ ์ด์ฉํด HTML ํ์ด์ง ์ ์ํด๋ณด๊ธฐ',
'[React] React ์์ state ๋ณ๊ฒฝํด๋ณด๊ธฐ'
]);
let [thumbsUp, setThumbsUp] = useState(0);
let [clickedNum, setClickedNum] = useState(0);
return (
<div className="App">
{
title.map(function(content, idx){
return (
<div className='list' key={idx}>
<h3 onClick={()=>{setClickedNum(idx)}}>
{content}
<span className='thumbs-up' onClick={ ()=>{ setThumbsUp(thumbsUp + 1) } }>๐</span>
{thumbsUp}
</h3>
<p>2022-03-18</p>
<hr/>
</div>
)
})
}
</div>
);
}
- ๊ธฐ์กด์ ์ฝ๋๋ ์์ ๊ฐ์๋ค.
- thumbs-up ์ด๋ผ๋ className ์ ๊ฐ์ง ํ๊ทธ์ onClick ์์ฑ์ ๋ณด๋ฉด ๊ฐ ๊ฒ์๊ธ๋ค์ ์ถ์ฒ ๋ฒํผ์ ๊ตฌ๋ณํ ์ ์๋ ๋ณ๋์ ์ฝ๋๊ฐ ์๋ค.
- ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ map() ํจ์๋ก ๊ฒ์๊ธ๋ค์ด ๋ ๋๋ง๋์ด ๋ธ๋ผ์ฐ์ ์ ๋ณด์ด๋ ์ํ์์ ์ด๋ค ์ถ์ฒ ๋ฒํผ์ ๋๋ฌ๋ ๋ค๋ฅธ ์ถ์ฒ ๋ฒํผ์ ์ํฅ์ ๋ฏธ์น๋ ๊ฒ์ด์๋ค.
๐ ์ถ์ฒ ๋ฒํผ ๊ธฐ๋ฅ ์ค๋ฅ ์์ ์ค
// ์ ์ฒด ์ฝ๋ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
// ์ ์ฒด ์ฝ๋๊ฐ ๋๋ฌด ๊ธธ์ด์ ์ผ๋ถ ๋ถํ์ํ ์ฝ๋๋ ์ ์ธํ๋ค.
function App() {
let [title, setTitle] = useState([
'[React] React ์ค์น์ ๊ฐ๋ฐํ๊ฒฝ ์
ํ
ํ๊ธฐ',
'[React] JSX ๋ฅผ ์ด์ฉํด HTML ํ์ด์ง ์ ์ํด๋ณด๊ธฐ',
'[React] React ์์ state ๋ณ๊ฒฝํด๋ณด๊ธฐ'
]);
let [thumbsUp, setThumbsUp] = useState([0, 0, 0]);
let [clickedNum, setClickedNum] = useState(0);
function changeThumbsUp(idx) {
let newThumbsUp = [...thumbsUp];
newThumbsUp[idx] = thumbsUp[idx] + 1;
setThumbsUp(newThumbsUp);
}
function addTitleAndThumbsUp(input) {
let newTitle = [...title];
newTitle.unshift(input);
setThumbsUp([0, ...thumbsUp]);
setTitle(newTitle);
}
return (
<div className="App">
{
title.map(function(content, idx){
return (
<div className='list' key={idx}>
<h3 onClick={()=>{setClickedNum(idx)}}>
{content}
<span className='thumbs-up' onClick={ ()=>{ changeThumbsUp(idx) } }>๐</span>
{thumbsUp[idx]}
</h3>
<p>2022-03-18</p>
<hr/>
</div>
)
})
}
</div>
);
}
// ์์ ์
let [thumbsUp, setThumbsUp] = useState(0);
// ์์ ํ
let [thumbsUp, setThumbsUp] = useState([0, 0, 0]);
- ๋งจ ์ฒ์ ๋ ์ฌ๋ฆฐ ๊ฒ์ ๊ฒ์๊ธ์ ๊ฐ์์ ์ถ์ฒ ๋ฒํผ์ ๊ฐ์๋ ์ด์ฐจํผ ๋์ผํ๋ฏ๋ก, title ์ด๋ผ๋ state ์ ์๋ฃํ๊ณผ ์์์ ๊ฐ์(3๊ฐ)์ thumbsUp ์ด๋ผ๋ state ์ ์๋ฃํ ๋ฐ ์์์ ๊ฐ์๋ฅผ ๋ง์ถฐ์ฃผ๋ ๊ฒ์ด์๋ค.
- ๋์ ๋ชฉ์ ์ ๋๊ตฐ๊ฐ๊ฐ 1๋ฒ ์ธ๋ฑ์ค์ ํด๋นํ๋ ์ถ์ฒ ๋ฒํผ์ ํด๋ฆญํ์ ๋ thumbsUp ์ [0, 1, 0] ์ผ๋ก ๋ฐ๊พธ์ด์ฃผ๊ณ , ์ด ์ํ์์ ๋๊ตฐ๊ฐ๊ฐ 0๋ฒ ์ธ๋ฑ์ค์ ํด๋นํ๋ ์ถ์ฒ ๋ฒํผ์ ํด๋ฆญํ๋ฉด [1, 1, 0] ์ด๋ฐ ์์ผ๋ก ๋๊ฒ ํ๋ ๊ฒ์ด์๋ค.
- ์ฌ๊ธฐ๊น์ง ์๊ฐํด๋ณด๋ ์ง๊ธ ๋ด๊ฐ ์๊ฐํ๊ณ ์๋ ๋ฐฉํฅ์ด ์ด์ ์ '์ฒซ๋ฒ์งธ ๊ธ์ ๋ชฉ ๋ฐ๊พธ๊ธฐ' ๋ฒํผ์ ๋ง๋ค์๋ ๋ฐฉ์๊ณผ idx ํ๋ผ๋ฏธํฐ๋ฅผ ํ์ฉํ๋ฉด ๊ฐ๋ฅํ ๊ฒ ๊ฐ์๋ค.
function addTitleAndThumbsUp(input) {
let newTitle = [...title];
newTitle.unshift(input);
setThumbsUp([0, ...thumbsUp]);
setTitle(newTitle);
}
- ๋จ, state ์ด๊ธฐ๊ฐ๋ง ์์ ์ ํ๋ ๊ฒฝ์ฐ, ๋์ค์ ๊ฒ์๊ธ ๋ฑ๋ก์ ํ๋ฉด ๋ค์ ์ถ์ฒ ๋ฒํผ ๊ธฐ๋ฅ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
- ๊ฒ์๊ธ์ ๋์ด๋๋๋ฐ ์ถ์ฒ ๋ฒํผ ๊ธฐ๋ฅ์ ๋ด๊ธด ๊ฐ์ 3๊ฐ์์ ๋์ด๋์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
- ๋ฐ๋ผ์, ๊ฒ์๋ฌผ์ด ์ถ๊ฐ๋๋ฉด ๊ธฐ๋ณธ๊ฐ์ 0 ์ผ๋ก ํ์ฌ setThumsUp() ์ ํตํด ์ถ๊ฐํ๋ ๊ฒ์ผ๋ก thumbsUp ์ ์์ ํด์ฃผ์๋ค.
- ์ด ๋ฐฉ๋ฒ์ด ์ซ๋ค๋ฉด, newTitle ์ ๋ง๋ค์ด์ setTitle() ์ ๋ฃ์ด์ title ์ ์์ ํด์ฃผ๋ฏ์ด thumbsUp ์ ์์ ํด๋ ๋๋ค.
{
title.map(function(content, idx){
return (
<div className='list' key={idx}>
<h3 onClick={()=>{setClickedNum(idx)}}>
{content}
<span className='thumbs-up' onClick={ ()=>{ changeThumbsUp(idx) } }>๐</span>
{thumbsUp[idx]}
</h3>
<p>2022-03-18</p>
<hr/>
</div>
)
})
}
- ์ผ๋จ html ์ด ๋ค์ด๊ฐ๋ ์ฝ๋๋ถํฐ ๋ค์ ์์ฑํ๋ค.
- changeThumbsUp() ์ด๋ผ๋ ํจ์๋ฅผ ๋ง๋ค์ด์ ๊ฒ์๋ฌผ ๊ตฌ๋ณ์ ํต์ฌ์ธ idx ๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฃ์ด์ฃผ์๋ค.
(์ด๋๊น์ง๋ ๊ตฌ์ฒด์ ์ผ๋ก ์ด๋ป๊ฒ ์ฝ๋๋ฅผ ์์ฑํ ์ง๋ ์๊ฐํ์ง๋ ์์๋ค.) - ๊ทธ๋ฆฌ๊ณ ์ถ์ฒ ๋ฒํผ ์ ์ซ์๋ thumbsUp ์ด๋ผ๋ state ์์ ํด๋นํ๋ idx ์ ๊ฐ์ ๋ถ๋ฌ์์ ์นด์ดํธํ ์ซ์๋ก ๋ณด์ฌ์ฃผ์ด์ผ ํ๋ฏ๋ก {thumbsUp[idx]} ๋ผ๊ณ ์์ฑํด์ฃผ์๋ค.
- ์ด๋ ๊ฒ ํ์ด ๋๋ต ๋ง๋ค์ด์ง ํ ๋ณธ๊ฒฉ์ ์ผ๋ก changeThumbsUp() ํจ์๋ฅผ ๋ง๋ค์ด๋ณด์๋ค.
function changeThumbsUp(idx) {
let newThumbsUp = [...thumbsUp];
newThumbsUp[idx] = thumbsUp[idx] + 1;
setThumbsUp(newThumbsUp);
}
- ์ผ๋จ idx ๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ ์์ ์ด๊ณ ํ๋ผ๋ฏธํฐ ์ด๋ฆ์ ๊ตณ์ด ๋ฐ๊ฟ ํ์ ์์ ๊ฒ ๊ฐ์ idx ๋ก ์์ฑํด์ฃผ์๋ค.
- ์ด์ ์ '์ฒซ๋ฒ์งธ ๊ธ์ ๋ชฉ ๋ฐ๊พธ๊ธฐ' ๋ฒํผ์ ๋ง๋ค์ด๋ณผ ๋, array ์๋ฃํ์ ์์ ๋ณต์ฌ๋ฅผ ํ๋ฉด ์ฌ๋ณธ๊ณผ ๊ฐ์ด ๊ณต์ ๋๋ฏ๋ก spread ๋ฌธ๋ฒ์ ์ฌ์ฉํ์ฌ ๊น์ ๋ณต์ฌ๋ฅผ ํด์ผํ๋ค๊ณ ํ๋ค.
- ๋ฐ๋ผ์ thumbsUp ๋ผ๋ state ์ ์๋ฃ๋ฅผ ๊น์ ๋ณต์ฌ๋ฅผ ํ์ฌ newThumbsUp ์ด๋ผ๋ ์๋ก์ด ๋ณต์ฌ๋ณธ์ ๋ง๋ค์ด์ฃผ์๋ค.
- ๊ทธ๋ฆฌ๊ณ newThumbsUp[idx] ์ thumbsUp[idx] ๊ฐ์ 1 ๋ํ ๊ฐ์ด ์ ์ฅ๋๋๋ก ํด์ฃผ์๋ค.
(์ฆ, ๋งจ์ฒ์์ idx ๊ฐ 1 ์ธ ์ถ์ฒ ๋ฒํผ์ ๋๋ฅด๋ฉด ์ต์ข ์ ์ผ๋ก ํจ์ ๋ด์์ newThumbsUp ์ [0, 1, 0] ์ด ๋๋ค.) - ๋ง๋ฌด๋ฆฌ๋ก setThumbsUp(newThumbsUp) ์ ํด์ฃผ๋ฉด thumbsUp ์ ์ ์ฅ๋ array ๊ฐ newThumbsUp ์ ์ ์ฅ๋ array ๋ก ๋ณ๊ฒฝ๋์ด ์ ์ฅ๋๋ ๊ฒ์ด๋ค.
(์ฆ, ์ด์ thumbsUp ์ด๋ผ๋ state ์๋ [0, 0, 0] ์ด ์๋๋ผ [0, 1, 0] ์ด ์ ์ฅ๋๋ ๊ฒ์ด๋ค.) - ์ด์ thumbsUp state ์ ๊ฐ ๊ฒ์๋ฌผ์ ์ธ๋ฑ์ค์ ๊ฐ์ +1 ์ด ๋๋ฏ๋ก ๊ฐ ์ถ์ฒ ๋ฒํผ์ ์๋ก์ ์ํฅ์ ๋ฐ์ง ์๊ฒ ๋๋ค.
๐ ์ถ์ฒ ๋ฒํผ ๊ธฐ๋ฅ ์ค๋ฅ ์์ ํ
- ๋ชจ๋ ์์ ์ด ๋๋๋ฉด ๋ธ๋ผ์ฐ์ ์์ ์์ ๊ฐ์ด ์ด๋ค ๋ฒํผ์ ๋๋ฌ๋ ๋ ๋ฆฝ์ ์ผ๋ก ์ซ์๊ฐ ์นด์ดํธ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
728x90
๋ฐ์ํ
'[๊ฐ๋ฐ] Practice > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] yarn ๊ณผ React Bootstrap ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์นํ๊ธฐ (0) | 2022.03.22 |
---|---|
[React] ๋ธ๋ก๊ทธ ๊ธ๋ฐํ ๊ธฐ๋ฅ ๋ง๋ค๊ธฐ (0) | 2022.03.22 |
[React] props ๋ฅผ ์์ฉํ ์์ธํ์ด์ง ๋ง๋ค๊ธฐ (0) | 2022.03.21 |
[React] React ์์ ๋ฐ๋ณต๋ฌธ ํ์ฉํ๊ธฐ (0) | 2022.03.21 |
[React] ํด๋ฆญํ๋ฉด ๋์ํ๋ UI (๋ชจ๋ฌ์ฐฝ) ๋ง๋ค์ด๋ณด๊ธฐ (0) | 2022.03.20 |