โ์๊ฒ๋ ๊ฒ๊ณผ ๋๋์
- global style๋ก reset.css ์ฌ์ฉํ๊ธฐ
- StyeldComponent์ ๋ณ์ ์ฌ์ฉํ์ฌ ์ ๋๋ฉ์ด์ ์ฃผ๊ธฐ
- Drag and Drop ์ฌ์ฉํ๊ธฐ
- ContextAPI + ์ํ๊ด๋ฆฌ์ ์ด๋ ค์
- TypeScript์ ์นํด์ง ์ ์์๊น?
๐ฅ๊ทธ๋์ ํด๋ณด๋ ์ ๋ฆฌ
1. global style๋ก reset.css ์ฌ์ฉํ๊ธฐ
src/styles/GlobalStyle.ts ๋ฅผ ์์ฑํ์ฌ ์ต์๋จ์์ importํ๋ค.
GlobalStyle์ ์์ฑํ ๋์๋ ์๋์๊ฐ์ด importํ์ฌ ์ ์ด์ผ ํ๋ค.
import { createGlobalStyle } from 'styled-components';
const GlobalStyle = createGlobalStyle`
* {
box-sizing: border-box;
}
// ๋ด์ฉ ์๋ต
`;
export default GlobalStyle;
2. StyeldComponent์ ๋ณ์ ์ฌ์ฉํ์ฌ ์ ๋๋ฉ์ด์ ์ฃผ๊ธฐ
์์์ ์ค์ฝ ๋์ค๋ ์ฌ์ด๋ํญ์ ๋ง๋ค์๋ค!
์ฌ์ด๋ํญ์ด ์ด๋ฆฌ๋ ๊ฑด ํ ์ ์์๋๋ฐ, ๋ถ๋๋ฝ๊ฒ ๋ซํ๋๊ฒ ์ ์๋ผ์ ์ง๋ฌธ๋๋ ธ๋๋ ๋ถ๋ชจ์ปดํฌ๋ํธ์์ ์ํ ๋ฐ์์ค๊ธฐ+์ผํญ์ฐ์ฐ์๋ก ํด๊ฒฐํด์ฃผ์ จ๋ค.
const fadeIn = keyframes`
from {
transform : translateX(30rem);
}
to {
transform: translateX(0);
}
`;
const fadeOut = keyframes`
from {
transform: translateX(0);
}
to {
transform: translateX(30rem);
}
`;
const SideTabWrapper = styled.div<{ fade: boolean }>`
//๋ด์ฉ ์๋ต
animation-duration: 0.4s;
animation-timing-function: ease-out;
animation-fill-mode: forwards;
animation-name: ${({ fade }) => (fade ? fadeIn : fadeOut)};
`;
fadeIn : ์ฌ์ด๋ํญ์ด ๋ณด์ฌ์ง๋ ํจ๊ณผ
fadeOut : ์ฌ์ด๋ํญ์ด ์ฌ๋ผ์ง๋ ํจ๊ณผ
3. Drag and Drop ์ฌ์ฉํ๊ธฐ
์ ๋ฒ ๊ณผ์ ์์ DND ๋์ผ๋ฉด ์ข๊ฒ ๋ค๊ณ ์ ์ด๋๋๋ฐ ๊ทธ๊ฒ ์ด๋ ๊ฒ ๊ณผ์ ๋ก ๋์ฌ์ค์ด์ผ^^.. ๊ทธ๋์ ์ง์ง ํด๋ณด๊ณ ์ถ์๋๋ฐ ์ฐ๋ฆฌ ์กฐ ์ค๊ณ๊ฐ ๋ณต์กํด์ ์์ํ๋๊ฑฐ๋ณด๋ค ํจ์ฌํจ์ฌ ํจ์ฌ ์ ๋ง ๋๋ฌด๋ง์ด ์ด๋ ค์์ ๊ณ์ ์ฝ์ง๋ง ํ๋ ๊ฒ ๊ฐ๋ค๐ญ (์ด๊ฑธ ๊ตฌํํด๋ด์ ํ์๋ถ์ ์ฒ์ฌ๊ฐ ์๋๊น)
์ฐ์ ์ด๋ ๊ฒ ์๊ฒผ๊ธฐ ๋๋ฌธ์ TO DO
, On Progress
, DONE
์ด ๋ถ๋ถ์ ์ ๋ถ ํ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฌ์ฉ ํ ๋ถ๋ถ์ด๋ค. (=TodoBoard)
1. ๊ทธ๋์ ๊ฐ์ ๋ณด๋(TO DO, On Progress, DONE)์ผ ๋์๋ state๊ฐ ์ ์ง๋์ง๋ง ๋๋๊ทธํด์ ์ ๋ผ์ธ์ผ๋ก ์ด๋ํ๊ฒ๋๋ฉด unmount
→ mount
๋๋ ๋ฌธ์ ๊ฐ ์์๋ค. = isDrag
(ํ์ฌ ๋๋๊ทธ ๋๊ณ ์๋ ์ค์ธ์ง๋ฅผ ๋ํ๋) ๋ฑ์ state๊ฐ ์ ์ง๋์ง ์์
2. ๋ํ onDrop
์ ์์๊ฐ ๋๋กญ์กด์ ๋์ฌ์ง ๋ ๋ฐ์ํ๋๋ฐ, ๋ง์ฐ์ค๊ฐ ๊ทธ ๋๋กญ์กด์ ๋ฒ์ด๋์๋ ์ํ๋ก ๋๊ฒ๋๋ฉด onDrop์ด ํธ์ถ๋์ง์๋ ๋ฌธ์ ๋ ์์๋ค. ๋๋กญ์กด์ ๋ฒ์ด๋์๋ ์ํ = ์์ ๊ทธ๋ฆผ์ฒ๋ผ ํฐ ์ฌ๋ฐฑ ๋ถ๋ถ(๋
ธ๋์ ๋ค๋ชจ๋ก ํ์)์ ๋ง์ฐ์ค๊ฐ ์๋ ์ํ๋ก ์์ ๋๊ฒ ๋๋ฉด onDrop์ด ์ ์ฉ์ด ์๋จ!
1์ ํด๊ฒฐํ๊ธฐ ์ํด isDrag๋ฅผ useState
๊ฐ ์๋ ContextAPI
๋ก ๊ด๋ฆฌํ๋ค. ๋๋๊ทธ๊ฐ ์์๋๋ฉด isDrag: true๊ฐ ๋๊ณ , ์ด๋ ContextAPI์ ์ ์ฅ์ด ๋์ด์๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ๋ผ์ธ์ผ๋ก ๋์ด๊ฐ๋ ์ํ๊ฐ ์ ์ง๋๋ค. ๊ทธ๋ฌ๋ค ๋ง์ฐ์ค๋ฅผ ๋์์ onDrop์ด ํธ์ถ๋๋ฉด isDrag: false๋ก ๋ง๋ค์ด์ ๋๋๊ทธ ์ค์ผ ๋ ๋ํ๋๋ ํจ๊ณผ๋ฅผ ์ ์ฉํ์ง ์๋๋ค.
2๋ ๋๋กญ์กด์ ์์ญ์ ํ๋ํ๋ค. (์ ๊ณ ๋ณด๋ ๋๋ฌด ๊ฐ๋จํด์ ์ต์ธํ๋ค!)
onDrop ์กฐ๊ฑด, ๋๋กญ์กด ๋ฑ๋ฑ ๊ฒ์ํ๋๋ onDrop์ด ์ ํฉํ ๊ณณ์ ๋จ์ด์ก์ ๋ ์คํ๋๋ค๊ณ ํด๊ฐ์ง๊ณ .. ๊ทธ๋์ ๊ทธ ์ ํฉํ๊ฑธ ์ด๋ป๊ฒ ๋ฐ๊ฟ์ผ ํ๋๋ฐ์..๐คํ๋๋ฐ ์ ์ฌ๋ฐฑ(๋ ธ๋ ๋ค๋ชจ)์ ํฌํจํ๋ ์ปดํฌ๋ํธ์ onDrop์ ์ค์ ํด์ฃผ์๋ค! isDrag๋ ContextAPI๋ก ๊ด๋ฆฌํ๊ณ ์์ผ๋๊น! ๊ทธ๋ฅ ๊ฐ์ ธ๋ค๊ฐ ์ฐ๋ฉด ๋๋ค! (์ฌ๊ธฐ์์ ๋๋ ์ํ๊ด๋ฆฌ ์งฑ์ด๋ ต๋ค๊ณ ์๊ฐํ๋ค) useState์๋ ์ด๋ณ ํ ๋๊ฐ ์จ ๊ฒ ๊ฐ๋ค....
4. ContextAPI + ์ํ๊ด๋ฆฌ์ ์ด๋ ค์
์์ ๋ฌธ์ ๋ก ์ธํด ContextAPI์ ์์คํจ์ ๊นจ๋ฌ์๋ค. (๋ง์นจ ์ง๋์ฃผ์ ๋ฆฌ๋์ค๋ฅผ ๋ฐฐ์ ๋๋ฐ..)
ContextAPI VS Redux๋ฅผ ์งง๊ฒ ์ ๋ฆฌํด๋ณด์๋ฉด.....
ContextAPI (ํ์ฌ ๋ก๊ทธ์ธํ ์ ์ , ํ ๋ง, ์ ํธํ๋ ์ธ์ด ๋ฑ์ ์ฌ์ฉํ๋ฉด ์ข์)
- ์ปดํฌ๋ํธ์ ์ฌ์ฌ์ฉ์ด ์ด๋ ค์์ง ์ ์๋ค
- Provider ํ์์์ context๋ฅผ ๊ตฌ๋ ํ๋ ๋ชจ๋ ์ปดํฌ๋ํธ๋ value prop์ด ๋ฐ๋ ๋ ๋ง๋ค ๋ค์ ๋ ๋๋ง ๋๋ค (๋น์ฐํ์ง!)
- ๊ธฐ๋ณธ์ ์ผ๋ก ํ๋์ context๋ฅผ ๊ตฌ๋ ํ๋๋ก ์ค๊ณ๋์ด์์ง๋ง, ์ฌ๋ฌ context๋ฅผ ๊ตฌ๋ ํ๊ธฐ ์ํด์๋ ๊ทธ ๊ฐ๋ค์ ํ๋ฒ์ ๋ฐ๋ render prop ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค ์ ์๋ค
Redux
- JS ์ฑ์ ์ํ ์์ธก ๊ฐ๋ฅํ ์ปจํ ์ด๋
- ์คํ ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ฅผ ์ปดํฌ๋ํธ ๊ตฌ์กฐ์ ๋ฐ๊นฅ์ ๋๊ณ , ์คํ ์ด๋ฅผ ์ค๊ฐ์๋ก ๋๊ณ ์ํ๋ฅผ ์ ๋ฐ์ดํธ ํ๊ฑฐ๋ ์๋ก์ด ์ํ๋ฅผ ์ ๋ฌ ๋ฐ๋๋ค
- Single source of Truth / State is read-only / Changes are made with pure functions ๋ผ๋ ์์น์ด ์๋ค
5. TypeScript์ ์นํด์ง ์ ์์๊น?
ํ์ ์คํฌ๋ฆฝํธ์ ๊ณ์ ์ธ์ฐ๋ ๋๋ ์.. ์ ๋ง ๋ฑ ํ๋๋ง ์ฅ์ด๋ฐ๊ณ ์ถ๋ค.. ๋ผ๋ ์๊ฐ์ ๋ฐฑ๋ฒ์ ๋ ํ ๊ฒ ๊ฐ๋ค.
๊ทธ๋์ JS๋ฅผ ์ผ๋ง๋ ๋ง ์จ์๋์ง ๋ค์ ๋๊ผ๊ณ , ํ์ ์คํฌ๋ฆฝํธ๋ ์ ๋ง ์ด๋ ต๋ค.
๊ทธ๋๋ ์ด๋ฒ ํ๊ณผ์ ์์๋ ์ธ๋ถ ๋ค ๋๋ณด๋ค ์ํ๋ ๋ถ๋ค์ด์ ์ ๋ค๋ฅธ๋ถ์ด ์ ์ํด๋ ํ์ ์ ๋ง์ด ๋ณผ ์ ์์ด์ ์ข์๋ค! ์ ๋ชจ๋ฅด๊ฒ ๋๊ฑด ๋ค๋ฅธ๋ถ๋ค์ ์ด๋ป๊ฒ ํ์ง? ํ๋ฉด์ ๊ธฐ์๊ฑฐ๋ฆฌ๊ธฐ๋ ํ๊ณ , ๋ง์ง๋ง์ ๋ฆฌํฉํ ๋งํ ๋๋ ๋ผ์ด๋ธ์์ด๋ก ๊ฐ์ด ๊ณ ๋ฏผ๋ ํ๊ณ ์ฌ๋ฌ๋ชจ๋ก ๊ธฐ์ต์ ๋จ๋ ๊ณผ์ ์๋ค.
๐๊ณผ์ ํ๊ธฐ
5๋ฒ์ด ์ฐ๋ค๋ณด๋ ํ๊ธฐ๊ฐ์์ ธ์ ๊ธํ๊ฒ ์ฌ๊ธฐ์ ์ ๊ธฐ ์์...
์ฌ์ค ์์ฌ์๋ ๋ง์ด ๋จ์๋คใ ใ DND ํด๋ณด๊ณ ์ถ์ด์ ๋ด๊ฐ ๋งก๊ฒ ๋ค๊ณ ํ๋๋ฐ ๊ฒฐ๊ตญ ๋ค๋ฅธ ํ์๋ถ๋ค์ด ๋ค ๋ด์ฃผ์ ์..ใ ใ ๊ทธ๋์ ์ด ์์ฌ์ ๊ทธ๋ฅ ๋จ๊ฒจ๋ ์ ์๋ค๊ณ ํ๋จ, ์ถํ ๊ฐ์ธ ํ๋ก์ ํธ์ ๋์ ํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค(ใ ใ ใ ใ ใ ใ ใ ใ ใ ) ์ฌ์ค... dnd๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฒ์ํ๋ฉด ์ฒ๊ฐ๋๊ฒ ๋์ค๊ฒ ์ง๋ง.... ๋ญ.. ๊ทธ๋๋ ํ ์ค์๋ฉด ์ข์ผ๋๊น...?๐ค
๊ทธ๋ฆฌ๊ณ ์ด๋ฒ ํ ๊ณผ์ ์ญ์ ๋งค์ผ ์คํฌ๋ผ์ ํ๋๋ฐ ์งํ ์ํฉ์ ์์ฃผ ๊ณต์ ํ๋๊น ํ์คํ ์ ์ฒด์ ์ธ ๊ทธ๋ฆผ์ ํ์ ํ๋๋ฐ๋ ์ข์ ๊ฒ ๊ฐ์๋ค. ๊ทธ๋ฆฌ๊ณ github์ ํ๋ก์ ํธ ๊ธฐ๋ฅ๋ ์ฌ์ฉํด๋ดค๊ณ , ์ด๋ฒ์๋ issue๊ด๋ฆฌ๋ ๊ฐ์ด ํ๊ธฐ๋ก ํ๋๋ฐ ์ ์ ๋ด๊ฐ ํฌ๊ฒ ํ์ฉ์ ๋ชปํ ๊ฒ ๊ฐ์์ ์์ฌ์์ด ๋จ๋๋ค. (์ธ๋ถ์ ์ผ๋ก ๋๋์ง ์๊ณ ๋ฉ์ธํ๋ฉด... ์ด๋ผ๊ณ ํญ ์ฌ๋ ค๋ ....) ์ด์ ์์ฑ -> ์ ๋ธ๋์น ์์ฑ -> ์์ -> ํธ์ -> PR -> ๋จธ์ง -> ์ด์ ๋ซ๊ธฐ -> ๋ธ๋์น ์ญ์ ์ด๋ฐ ๋๋์ด์๋๋ฐ ์์ฃผ ๋ชปํด๋ด์ ์์ฌ์ด ๋๋..? ๊ทธ๋ฆฌ๊ณ ์ ๋ ๊ฒ ํ์๊ณ ์ ์ํด์ฃผ์ จ๋๋ฐ ๋ด๊ฐ ์ ๋๋ก ๋ค ๋ชป์ง์ผ์ ์ฃ์กํ๊ธฐ๋ ํ๊ณ ..๐ญ ํ์คํ ํผ์ ํ๋๊ฑฐ๋ณด๋ค ํํ์ด ์ด๋ ต์ง๋ง ๋ฐฐ์ฐ๋๊ฒ๋ ๋ง์ ๊ฒ ๊ฐ๋ค. ์ด๋ฒ ํํ์.. ๋นจ๋ฆฌ ๋ ์ํด์ง๊ณ ์ถ๋ค๋ ์๊ฐ์ด ๋ง์ด ๋ ๊ณผ์ ์๋ค....ใ ใ
๐์ฐธ๊ณ (๊ฐ์ฌํฉ๋๋ค)
React ์ํ ๊ด๋ฆฌ Tool ์ฌ์ฉ & ๋น๊ต - (Redux VS MobX VS Context API)
1. Context API https://ko.reactjs.org/docs/context.html#when-to-use-context https://www.youtube.com/watch?v=5LrDIWkK_Bc context๋ React ์ปดํฌ๋ํธ ํธ๋ฆฌ
velog.io
๋ฆฌ๋์ค(Redux)๋ฅผ ์ ์ธ๊น? ๊ทธ๋ฆฌ๊ณ ๋ฆฌ๋์ค๋ฅผ ํธํ๊ฒ ์ฌ์ฉํ๊ธฐ ์ํ ๋ฐ์ (i) | VELOPERT.LOG
์ด ํฌ์คํธ๋ ๋ฆฌ๋์ค์ ๋ฆฌ๋ ๋ชจ๋ฅด๋ ๋ ์๋ค์ ๋์์ผ๋ก ์์ฑ๋ ๊ธ์ ๋๋ค. ๋ฆฌ๋์ค๊ฐ ์ ํ์ํ์ง ์์๋ณด๊ณ , ๋ฆฌ๋์ค๋ฅผ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ๊ธฐ ์ํ ๋ฐ์ ์ ํ๋ฒ ํด๋ณด๊ฒ ์ต๋๋ค. ๋ฆฌ๋์ค ์ ์ธ๊น? ๋ฆฌ์กํธ
velopert.com
'๐๊ณต๋ถ > ํ๋ฆฌ์จ๋ณด๋ฉ์ฝ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ฆฌ์จ๋ณด๋ฉ์ฝ์ค] 6์ฃผ์ฐจ - ๊ณผ์ 9 (0) | 2021.09.12 |
---|---|
[ํ๋ฆฌ์จ๋ณด๋ฉ์ฝ์ค] 3์ฃผ์ฐจ -๊ณผ์ 5 (0) | 2021.09.06 |
[ํ๋ฆฌ์จ๋ณด๋ฉ์ฝ์ค] 4์ฃผ์ฐจ - ๊ณผ์ 7 (0) | 2021.08.23 |
[ํ๋ฆฌ์จ๋ณด๋ฉ์ฝ์ค] 4์ฃผ์ฐจ - ๊ณผ์ 6 (0) | 2021.08.18 |
[ํ๋ฆฌ์จ๋ณด๋ฉ์ฝ์ค] 3์ฃผ์ฐจ - ๊ณผ์ 4 (0) | 2021.08.11 |
๋๊ธ