Tiny Bunny
[TIL] Week 14 ๋ผ์šฐํŒ…๊ณผ API ํ†ต์‹  ๊ตฌํ˜„ - ์นดํ…Œ๊ณ ๋ฆฌ ์กฐํšŒ & ํšŒ์›๊ฐ€์ž…
ยท
๐Ÿ•Š๏ธ DevCourse/Frontend
๐Ÿงญ RouteReact Router๋ฅผ ์‚ฌ์šฉํ•ด ํŽ˜์ด์ง€๋“ค์˜ ๋ผ์šฐํŠธ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ๋ ค ํ•œ๋‹ค. ์„ค์น˜`npm install react-router-dom @types/react-router-dom --save` ์‚ฌ์šฉ// App.tsximport { createBrowserRouter, RouterProvider } from "react-router-dom";const router = createBrowserRouter([ { path: "/", element: , }, { path: "/books", element: ๋„์„œ ๋ชฉ๋ก }])function App() { return ( );}์ฃผ์†Œ์— ๋งž๋Š” ํ™”๋ฉด์ด ์ž˜..
[TIL] Week 13 ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ ์ž‘์„ฑ ๊ธฐ์ดˆ
ยท
๐Ÿ•Š๏ธ DevCourse/Frontend
๐ŸซŸ ๊ธฐ๋ณธ ์ปดํฌ๋„ŒํŠธ ์ž‘์„ฑ1๏ธโƒฃ Title ์ปดํฌ๋„ŒํŠธ// theme.tsexport type HeadingSize = `large` | `medium` | `small`;interface Theme { name: ThemeName; color: Record; heading : { [key in HeadingSize]: { fonstSize: string; }; }}export const light: Theme = { name: `light`, color: { primary: `brown`, background: `lightgray`, secondary: `blue`, third: `..
[TIL] Week 13 ๋ฆฌ์•กํŠธ ๋ ˆ์ด์•„์›ƒ ๊ตฌ์„ฑ๊ณผ ์Šคํƒ€์ผ ์‹œ์Šคํ…œ
ยท
๐Ÿ•Š๏ธ DevCourse/Frontend
๐ŸŽก ๋ ˆ์ด์•„์›ƒ ๊ตฌ์„ฑํ•„์š”์„ฑํ”„๋กœ์ ํŠธ์˜ ๊ธฐ๋ณธ์ ์ธ ํ™”๋ฉด ๊ตฌ์กฐ ์žก๊ธฐ๋ฐ˜๋ณต์ ์œผ๋กœ ๋“ค์–ด๊ฐ€์•ผํ•˜๋Š” ํ—ค๋”, ํ‘ธํ„ฐ ๋“ฑ์„ ๋งค ํ™”๋ฉด๋งˆ๋‹ค ์ œ๊ณต์ƒํ™ฉ๊ณผ ํ•„์š”์— ๋”ฐ๋ผ ๋ ˆ์ด์•„์›ƒ์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋„๋ก ๋Œ€๋น„์‹ฑ๊ธ€ํŽ˜์ด์ง€์•ฑ์€ ์ฃผ๋กœ ์ปดํฌ๋„ŒํŠธ์˜ ์กฐํ•ฉ์œผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.ํ™”๋ฉด๋งˆ๋‹ค ๊ณตํ†ต๋œ ์ปดํฌ๋„ŒํŠธ๋„ ์žˆ๊ณ  ํŽ˜์ด์ง€๋งˆ๋‹ค ์žˆ๊ฑฐ๋‚˜ ์—†๋Š” ์ปดํฌ๋„ŒํŠธ๋„ ์กด์žฌํ•œ๋‹ค.์ด๋Ÿฐ ์ „์ฒด์ ์ธ ํ‹€์„ ์žก์•„์ฃผ๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•˜๋‹ค. ์ƒ์„ฑimport Footer from "../common/Footer";import Header from "../common/Header";interface LayoutProps { children: React.ReactNode;}function Layout({ children }: LayoutProps) { return ( ..
[TIL] Week 13 React ํ”„๋กœ์ ํŠธ : CRA์™€ Vite
ยท
๐Ÿ•Š๏ธ DevCourse/Frontend
โšก๏ธ ์ƒ์„ฑ์ข…๋ฅ˜CRA (Create React App)ViteํŠน์ง•• ์ดˆ๊ธฐ ์„ค์ •๊ณผ ๊ตฌ์„ฑ ์ž๋™ํ™”๋กœ ๋น ๋ฅด๊ฒŒ ์ƒ์„ฑ ๊ฐ€๋Šฅ• ์›นํŒฉ, ๋ฐ”๋ฒจ์„ ์‚ฌ์šฉํ•ด ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰• ๊ฐœ๋ฐœ ์‹œ ๊ฐœ๋ฐœ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ํ™”๋ฉด์— ๋ฐ”๋กœ ์ ์šฉํ•˜๋Š” ํ•ซ๋ชจ๋“ˆ ๋ฆฌ๋กœ๋”ฉ• ๋น ๋ฅธ ์†๋„์™€ ํšจ์œจ• ๋ชจ๋“ˆ ๋‹จ์œ„๋กœ ๋นŒ๋“œํ•ด ์›นํŒฉ๋ชจ๋‹ค ์†๋„ ๋น ๋ฅธ ๋กค์—…์œผ๋กœ ๋นŒ๋“œ• ๋น ๋ฅธ ํ•ซ๋ชจ๋“ˆ ๋ฆฌ๋กœ๋”ฉ๊ณผ ๋นŒ๋“œ ์‹œ๊ฐ„ ์ตœ์†Œํ™”๋ฅผ ์œ„ํ•ด ES๋ชจ๋“ˆ ์‚ฌ์šฉ์„ค์น˜`npx create-react-app ํ”„๋กœ์ ํŠธ๋ช… --template typescript``npm create vite@latest ํ”„๋กœ์ ํŠธ๋ช… -- --template react-ts`node_modules์„ค์น˜๋ฅผ ์ƒ๋žตํ•˜๋ฏ€๋กœ ์ƒ์„ฑ ์ดํ›„ `npm install` ์‹ค์‹œ์‹คํ–‰`npm run start``npm run dev` ๋‘ ๋ฐฉ์‹์˜ `package.jso..
[TIL] Week 13 ๋ฆฌ์•กํŠธ๋กœ Task ์ƒ์„ฑ ์•ฑ ๋งŒ๋“ค๊ธฐ 4
ยท
๐Ÿ•Š๏ธ DevCourse/Frontend
๐Ÿ‘†๐Ÿป Drag And Drop ๊ธฐ๋Šฅ ๊ตฌํ˜„๐Ÿšจ ๊ฐ•์‚ฌ๋‹˜๊ป˜์„œ๋Š” `react-beautiful-dnd`๋ฅผ ์‚ฌ์šฉํ•˜์…จ์ง€๋งŒ ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์œ ์ง€๋ณด์ˆ˜ ์ค‘๋‹จ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ํ˜„์žฌ ๋ฆฌ์•กํŠธ ๋ฒ„์ „๊ณผ ๋งž์ง€ ์•Š์•„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ด ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” `@hello-pangea/dnd`๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. GitHub - hello-pangea/dnd: ๐Ÿ’… Beautiful and accessible drag and drop for lists with React. โญ๏ธ Star to support our work!๐Ÿ’… Beautiful and accessible drag and drop for lists with React. โญ๏ธ Star to support our work! - hello-pangea/dndgithub.com์„ค์น˜ `..
[TIL] Week 13 ๋ฆฌ์•กํŠธ๋กœ Task ์ƒ์„ฑ ์•ฑ ๋งŒ๋“ค๊ธฐ 3
ยท
๐Ÿ•Š๏ธ DevCourse/Frontend
โœ๏ธ ํ•  ์ผ ์ˆ˜์ •ํ•˜๊ธฐconst modalActive = useTypedSelector(state => state.boards.modalActive);return ( // ... {modalActive ? : null} // ...)ํ•  ์ผ์„ ํด๋ฆญํ•˜๋ฉด ์ˆ˜์ • ๋˜๋Š” ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋‹ฌ์ด ๋‚˜์˜ค๋„๋ก ํ•˜์˜€๋‹ค. const handleNameChange = (e: ChangeEvent) => { setData({ ...data, task: { ...data.task, taskName: e.target.value } })}const handleDescriptionChange = (e: ChangeEvent) => { setData({ ...data, task:..
[TIL] Week 12 ๋ฆฌ์•กํŠธ๋กœ Task ์ƒ์„ฑ ์•ฑ ๋งŒ๋“ค๊ธฐ2
ยท
๐Ÿ•Š๏ธ DevCourse/Frontend
๐Ÿ“Œ clsx()์กฐ๊ฑด๋ถ€๋กœ className์„ ๊ฒฐํ•ฉํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ GitHub - lukeed/clsx: A tiny (239B) utility for constructing `className` strings conditionally.A tiny (239B) utility for constructing `className` strings conditionally. - lukeed/clsxgithub.com  b.boardId === activeBoardId) === index, }, { [boardItem]: boardArray.findIndex(b => b.boardId === activeBoardId) !== index } ..
[TIL] Week 12 ๋ฆฌ์•กํŠธ๋กœ Task์ƒ์„ฑ ์•ฑ ๋งŒ๋“ค๊ธฐ
ยท
๐Ÿ•Š๏ธ DevCourse/Frontend
โš™๏ธ ํŒจํ‚ค์ง€ ์„ค์น˜`npm` : ํŒจํ‚ค์ง€๋ฅผ ๊ฐ€์ ธ์™€ `node_modules`์— ์„ค์น˜ํ•ด์„œ ์‚ฌ์šฉ`npx` : ํŒจํ‚ค์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์€ ๋™์ผํ•˜์ง€๋งŒ `node_modules`์— ์„ค์น˜ํ•˜์ง„ ์•Š์Œ1. `npm init vite` : vite๋กœ ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ2. `npm i` : ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜ 3. `npm run dev` : ๋ฆฌ์•กํŠธ ์‹คํ–‰ ์ถ”๊ฐ€ ์„ค์น˜ ํŒจํ‚ค์ง€๋”๋ณด๊ธฐnpm install @reduxjs/toolkit redux clsx @vanilla-extract/css @vanilla-extract/css-utils @vanilla-extract/vite-plugin react-icons uuid react-beautiful-dnd react-redux• `clsx` : ํด๋ž˜์Šค ์ด๋ฆ„์„ ๋™์ ์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์‚ฌ..
๋ฏผ๋ฆฌ๋ฒ„
'๐Ÿ•Š๏ธ DevCourse/Frontend' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก