๐Ÿ“ƒ Front-End/React.js

๐Ÿ“ƒ Front-End/React.js

React + TS + Style-Components

ํฌ์ŠคํŒ… ์ฃผ ๋‚ด์šฉ์€ ์ „์—ญ ์Šคํƒ€์ผ(Global), ํ…Œ๋งˆ(theme), ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ ์šฉ์— ํฌ์ปค์Šค๋ฅผ ๋งž์ถ”๊ฒ ์Šต๋‹ˆ๋‹ค. react ๋ฅผ ์‚ฌ์šฉํ•ด๋ณธ์ ์ด ์žˆ๊ฑฐ๋‚˜, ์Šคํƒ€์ผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์‹  ์ ์ด ์žˆ์œผ์‹  ๋ถ„๋“ค์€ ์•„๋ž˜ ์ฝ”๋“œ ์ˆœ์„œ๋งŒ ๋ณด๊ณ  ์ถฉ๋ถ„ํžˆ ๊ฐ์„ ์žก์œผ์‹ค ์ˆ˜ ์žˆ์„ ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐ ํ•ฉ๋‹ˆ๋‹ค. โœ” ํ™˜๊ฒฝ ์„ธํŒ… // ์Šคํƒ€์ผ ์ปดํฌ๋„ŒํŠธ ์„ค์น˜ yarn add styled-components // ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ ์šฉ yarn add --dev @types/styled-components โœ” styled.d.ts import 'styled-components'; declare module 'styled-components' { export interface DefaultTheme { TitleFont : { fontSize : any; fontF..

๐Ÿ“ƒ Front-End/React.js

React-Query ์บ์‹ฑ์— ๋Œ€ํ•˜์—ฌ

stale ๋Œ€ํ•˜์—ฌ ๋ฆฌ์•กํŠธ ์ฟผ๋ฆฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์บ์‹œ๋œ ๋ฐ์ดํ„ฐ๋ฅผ staleํ•œ ์ƒํƒœ๋กœ ์—ฌ๊น๋‹ˆ๋‹ค. stale์ด๋ž€ ์ตœ์‹ ํ™”๊ฐ€ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ผ๋Š” ์˜๋ฏธ๋กœ staleํ•œ ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ๋‹ค์Œ์˜ ๊ฒฝ์šฐ์— refetch ๋ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด query ์ธ์Šคํ„ด์Šค๊ฐ€ ๋งˆ์šดํŠธ๋  ๋•Œ( useQuery๊ฐ€ ์ฒ˜์Œ ํ˜ธ์ถœ๋  ๋•Œ ) ๋ธŒ๋ผ์šฐ์ € ํ™”๋ฉด์„ ์ดํƒˆํ–ˆ๋‹ค๊ฐ€ ๋‹ค์‹œ ํฌ์ปค์Šคํ•  ๋•Œ ๋„คํŠธ์›Œํฌ๊ฐ€ ๋‹ค์‹œ ์—ฐ๊ฒฐ๋  ๋•Œ ํŠน๋ณ„ํžˆ ์„ค์ •ํ•œ refetch interval์— ์˜ํ•ด์„œ (refetchInterval) refetchOnWindowFocus ์˜ต์…˜ ๋“ฑ์œผ๋กœ ๊ธฐ๋ณธ refetch ์„ค์ •์„ ๋ง‰์„ ์ˆ˜ ์žˆ๊ณ  staleTime ์˜ต์…˜์œผ๋กœ ์„ค์ •ํ•œ ์‹œ๊ฐ„ ๋™์•ˆ ๋ฐ์ดํ„ฐ๊ฐ€ stale ๋˜์ง€ ์•Š๋„๋ก ํ•ด refetch๋ฅผ ๋ง‰์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. query์— ๋ณ„๋‹ค๋ฅธ action์ด ์—†์œผ๋ฉด inactive ์ƒํƒœ๋กœ ..

๐Ÿ“ƒ Front-End/React.js

react-router-dom V6 ๊ณต๋ถ€

์„ค์น˜ yarn add react-router-dom โœ” createBrowserRouter() const router = createBrowserRouter([๊ฐ ๊ฒฝ๋กœ์˜ ๋ฐฐ์—ด]) App.js import React from 'react'; import { createBrowserRouter, RouterProvider } from 'react-router-dom'; const router = createBrowserRouter([]); export default function App() { return } ์œ„์™€ ๊ฐ™์ด ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์— ์„ธํŒ…์„ ํ•ด์ค๋‹ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ ๊ฒฝ๋กœ์— ์ถ”๊ฐ€ํ•˜๊ธฐ import React from 'react'; import { createBrowserRouter, RouterProvider ..

๐Ÿ“ƒ Front-End/React.js

React + TypeScript(state)

๊ธฐ์กด์˜ useState ์‚ฌ์šฉ ๋ฐฉ์‹ const [count, setCount] = useState(์ดˆ๊ธฐ ๊ฐ’); useState ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด value ๋ฅผ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๊ฐ’์€ state ์˜ value ์ž…๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ๊ฐ’์€ value ์˜ ์ƒํƒœ ๋ณ€ํ™” ํ•จ์ˆ˜ ์ž…๋‹ˆ๋‹ค. useState ์— ์ดˆ๊ธฐ ๊ฐ’์„ ๋„ฃ์œผ๋ฉด โ“ const [count, setCount] = useState(1); count ์— ์ˆซ์ž ๊ฐ’์ด ๋“ค์–ด์˜จ๋‹ค๊ณ  TypeScript ๊ฐ€ ์ดˆ๊ธฐ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์ถ”๋ก ์„ ํ•œ ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ const [count, setCount] = useState(1); setCount(2); ์•„๋ฌด ์ผ๋„ ์ƒ๊ธฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ๋Œ€๋กœ ์ž‘์„ฑ์„ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•˜์ง€๋งŒ ๋งŒ์•ฝ string ํƒ€์ž…์„ ๋ณด๋‚ด๊ฒŒ ๋˜๋ฉด, ์—๋Ÿฌ๊ฐ€ ์žˆ๋‹ค๊ณ  ๋งํ•ด์ค..

๐Ÿ“ƒ Front-End/React.js

React + TypeScript(Optional Props)

default props App.tsx import Circle from "./Circle"; function App() { return ( ); } export default App; Circle.tsx import React from "react"; import styled from "styled-components" interface ContainerProps { bgColor : string; } const Container = styled.div` width : 200px; height : 200px; background-color : ${(props) => props.bgColor}; `; interface CircleProps { // TypeScript ์—๊ฒŒ bgColor ๋Š” ๋ฌธ์ž์—ด์ด๋ผ๊ณ  ..

๐Ÿ“ƒ Front-End/React.js

React + TypeScript(interface)

๊ธฐ๋ณธ์ ์ธ ํƒ€์ž… ์Šคํฌ๋ฆฝํŠธ์— ๋Œ€ํ•œ ์„ค๋ช…์€ ๋ณ„๋„์˜ ํฌ์ŠคํŒ…์„ ํ†ตํ•ด ์ •๋ฆฌ๋ฅผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ๋ฆฌ์•กํŠธ์—์„œ ํƒ€์ž… ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ์ ์šฉ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ณต๋ถ€ํ•˜๊ณ  ์ •๋ฆฌ ํ•ฉ๋‹ˆ๋‹ค! + ์Šคํƒ€์ผ ์ปดํฌ๋„ŒํŠธ ์ ์šฉ ์„ค์น˜ โ“ 1. ์ฒ˜์Œ๋ถ€ํ„ฐ CRA + ํƒ€์ž… ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ•  ๋•Œ npx create-react-app my-app --template typescript or yarn create react-app my-app --template typescript 2. ํ”„๋กœ์ ํŠธ ์ค‘๊ฐ„์— ์„ค์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ• npm install --save typescript @types/node @types/react @types/react-dom @types/jest or yarn add typescript @types/node @types/react @type..

๐Ÿ“ƒ Front-End/React.js

useInfiniteQuery ํ˜ธ์ถœ

โœ” useInfiniteQuery ๊ฐ€์ ธ์˜ค๊ธฐ import InfiniteScroll from "react-infinite-scroller"; import { Person } from "./Person"; // ์ด ๋ถ€๋ถ„ import { useInfiniteQuery } from "react-query"; const initialUrl = "https://swapi.dev/api/people/"; const fetchUrl = async (url) => { const response = await fetch(url); return response.json(); }; export function InfinitePeople() { // ์ปดํฌ๋„ŒํŠธ์—์„œ ํ˜ธ์ถœ const {data, fetchNextPage, hasNe..

๐Ÿ“ƒ Front-End/React.js

React Query - ๋ฌดํ•œ ์Šคํฌ๋กค(Infinite Scroll)

์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€์˜ ํŠน์ • ์ง€์ ์„ ๋ˆ„๋ฅด๊ฑฐ๋‚˜ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๋” ๋งŽ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋กœ๋”ฉ๋ฉ๋‹ˆ๋‹ค. React Query ๋Š” ๋ฐ์ดํ„ฐ์™€ ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ๋ฅผ ์ถ”์ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋ฌดํ•œ ์Šคํฌ๋กค ์ด๋ž€ โ“ ์‚ฌ์šฉ์ž๊ฐ€ ์Šคํฌ๋กค ํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ํšจ์œจ์  ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•˜๋Š” ์ง€์  ์‚ฌ์šฉ์ž๊ฐ€ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๊ฑฐ๋‚˜ ํŽ˜์ด์ง€์˜ ํŠน์ • ์ง€์ ์„ ์Šคํฌ๋กค ํ–ˆ์„ ๋•Œ ์ƒˆ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ฒŒ ํ•˜๊ฑฐ๋‚˜ ( ํŽ˜์ด์ง€์˜ ํ•˜๋‹จ ๋“ฑ ) โœ” useInfiniteQuery ์˜ ํŠน์ง• ๋ฐ˜ํ™˜ ๊ฐ์ฒด์—์„œ ๋ฐ˜ํ™˜๋œ ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ์˜ ํ˜•ํƒœ๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. useQuery : ๋‹จ์ˆœํžˆ ์ฟผ๋ฆฌ ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜๋˜๋Š” ๋ฐ์ดํ„ฐ useInfiniteQuery : ๋‘ ๊ฐœ์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ๋ฐ์ดํ„ฐ ํŽ˜์ด์ง€ ๊ฐ์ฒด ..

HoHo.dev
'๐Ÿ“ƒ Front-End/React.js' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก