๐ Front-End/React.js
ํฌ์คํ
์ฃผ ๋ด์ฉ์ ์ ์ญ ์คํ์ผ(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
stale ๋ํ์ฌ ๋ฆฌ์กํธ ์ฟผ๋ฆฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์บ์๋ ๋ฐ์ดํฐ๋ฅผ staleํ ์ํ๋ก ์ฌ๊น๋๋ค. stale์ด๋ ์ต์ ํ๊ฐ ํ์ํ ๋ฐ์ดํฐ๋ผ๋ ์๋ฏธ๋ก staleํ ์ํ๊ฐ ๋๋ฉด ๋ค์์ ๊ฒฝ์ฐ์ refetch ๋ฉ๋๋ค. ์๋ก์ด query ์ธ์คํด์ค๊ฐ ๋ง์ดํธ๋ ๋( useQuery๊ฐ ์ฒ์ ํธ์ถ๋ ๋ ) ๋ธ๋ผ์ฐ์ ํ๋ฉด์ ์ดํํ๋ค๊ฐ ๋ค์ ํฌ์ปค์คํ ๋ ๋คํธ์ํฌ๊ฐ ๋ค์ ์ฐ๊ฒฐ๋ ๋ ํน๋ณํ ์ค์ ํ refetch interval์ ์ํด์ (refetchInterval) refetchOnWindowFocus ์ต์
๋ฑ์ผ๋ก ๊ธฐ๋ณธ refetch ์ค์ ์ ๋ง์ ์ ์๊ณ staleTime ์ต์
์ผ๋ก ์ค์ ํ ์๊ฐ ๋์ ๋ฐ์ดํฐ๊ฐ stale ๋์ง ์๋๋ก ํด refetch๋ฅผ ๋ง์ ์๋ ์์ต๋๋ค. query์ ๋ณ๋ค๋ฅธ action์ด ์์ผ๋ฉด inactive ์ํ๋ก ..
๐ Front-End/React.js
์ค์น 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
๊ธฐ์กด์ 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
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
๊ธฐ๋ณธ์ ์ธ ํ์
์คํฌ๋ฆฝํธ์ ๋ํ ์ค๋ช
์ ๋ณ๋์ ํฌ์คํ
์ ํตํด ์ ๋ฆฌ๋ฅผ ํ์ต๋๋ค. ์ฌ๊ธฐ์๋ ๋ฆฌ์กํธ์์ ํ์
์คํฌ๋ฆฝํธ๋ฅผ ์ด๋ป๊ฒ ์ ์ฉ ํ ์ ์๋์ง ๊ณต๋ถํ๊ณ ์ ๋ฆฌ ํฉ๋๋ค! + ์คํ์ผ ์ปดํฌ๋ํธ ์ ์ฉ ์ค์น โ 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 ๊ฐ์ ธ์ค๊ธฐ 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 ๋ ๋ฐ์ดํฐ์ ํ์ด์ง ๋ฒํธ๋ฅผ ์ถ์ ํ๊ฒ ๋ฉ๋๋ค. ๋ฌดํ ์คํฌ๋กค ์ด๋ โ ์ฌ์ฉ์๊ฐ ์คํฌ๋กค ํ ๋๋ง๋ค ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ ์
๋๋ค. ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ๊ฐ์ ธ์ค๋ ๊ฒ๋ณด๋ค ํจ์ฌ ํจ์จ์ ์
๋๋ค. ์ฌ์ฉํ๋ ์ง์ ์ฌ์ฉ์๊ฐ ๋ฒํผ์ ํด๋ฆญํ์ฌ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๊ฑฐ๋ ํ์ด์ง์ ํน์ ์ง์ ์ ์คํฌ๋กค ํ์ ๋ ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ฒ ํ๊ฑฐ๋ ( ํ์ด์ง์ ํ๋จ ๋ฑ ) โ useInfiniteQuery ์ ํน์ง ๋ฐํ ๊ฐ์ฒด์์ ๋ฐํ๋ ๋ฐ์ดํฐ ํ๋กํผํฐ์ ํํ๊ฐ ๋ค๋ฆ
๋๋ค. useQuery : ๋จ์ํ ์ฟผ๋ฆฌ ํจ์์์ ๋ฐํ๋๋ ๋ฐ์ดํฐ useInfiniteQuery : ๋ ๊ฐ์ ํ๋กํผํฐ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ํ๋๋ ๋ฐ์ดํฐ ํ์ด์ง ๊ฐ์ฒด ..