๐Ÿ“ƒ Front-End/React.js

๐Ÿ“ƒ Front-End/React.js

React Query - ๋งŒ๋“ค๊ธฐ

์ฝ”๋“œ ๊ตฌ์กฐ โœ” App.js import { Posts } from "./Posts"; import "./App.css"; function App() { return ( // provide React Query client to App Blog Posts ); } export default App; โœ” Posts.js import { useState } from "react"; import { PostDetail } from "./PostDetail"; const maxPostPage = 10; async function fetchPosts() { const response = await fetch( "https://jsonplaceholder.typicode.com/posts?_limit=10&_page..

๐Ÿ“ƒ Front-End/React.js

React Query โ“

react ์˜ ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž…๋‹ˆ๋‹ค. Client State vs Server State โ“ โœ” Client State ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ๋ž€, ์›น ๋ธŒ๋ผ์šฐ์ € ์„ธ์…˜๊ณผ ๊ด€๋ จ๋œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ์˜๋ฏธ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ์ž๋Š” ๊ฐ€์žฅ ์ž˜ ์•„๋Š” ์–ธ์–ด๋กœ ํ…์ŠคํŠธ๋ฅผ ์ฝ๊ธฐ ์œ„ํ•ด, ์–ธ์–ด๋ฅผ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ํ…Œ๋งˆ๋ฅผ ๋ฐ์€ ์ƒ‰์ด๋‚˜, ์–ด๋‘์šด ์ƒ‰์œผ๋กœ ๋ณ€๊ฒฝ ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋Ÿฐ ๊ฒƒ์€ ์„œ๋ฒ„์—์„œ ์ผ์–ด๋‚˜๋Š” ์ผ๊ณผ๋Š” ์•„๋ฌด ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ์‚ฌ์šฉ์ž์˜ ์ƒํƒœ๋ฅผ ์ถ”์ ํ•˜๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค. โœ” Server State ์„œ๋ฒ„ ์ƒํƒœ๋Š”, ์„œ๋ฒ„์— ์ €์žฅ๋˜์ง€๋งŒ ํด๋ผ์ด์–ธํŠธ์— ํ‘œ์‹œํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋˜๋Š” ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ ๋ฐ์ดํ„ฐ๊ฐ€ ์ด์— ํ•ด๋‹น ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์˜ ๊ฒŒ์‹œ๋ฌผ์„ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ํด๋ผ์ด์–ธํŠธ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์–ด์•ผ ํ•˜์ง€๋งŒ, ๋ฐ์ดํ„ฐ๋Š” ..

๐Ÿ“ƒ Front-End/React.js

Redux Toolkit

redux-toolkit์€ ๊ธฐ์กด redux์˜ ์—ฌ๋Ÿฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ ๋ฒ„์ „์˜ ๋ชจ๋“ˆ์ด๋‹ค. redux์™€ ๋ณธ์งˆ์€ ๋™์ผํ•˜๊ณ , ๋” ์‚ฌ์šฉํ•˜๊ธฐ ํŽธํ•˜๊ฒŒ ๊ฐœ๋Ÿ‰ํ•œ ๋ฒ„์ „ โœ” ์„ค์น˜ npm install @reduxjs/toolkit react-redux โœ” ์‚ฌ์šฉ๋ฒ• 1. store.js ์ค€๋น„ // store.js import { configureStore } from "@reduxjs/toolkit"; //redux store export const store = configureStore({ reducer: {}, }); reducer๊ฐ€ ํฌํ•จ๋œ ๊ฐ์ฒด๋ฅผ configureStore ์— ์ „๋‹ฌํ•˜๋ฉด ๊ฐ„๋‹จํžˆ redux store๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค. ์ด๊ฒƒ์„ react ์— ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด index.js ๋กœ ๊ฐ€์„œ import React from "re..

๐Ÿ“ƒ Front-End/React.js

React - SVG ํŒŒ์ผ ์‚ฌ์šฉ๋ฒ•

svg๋Š” png์™€ ๋‹ค๋ฅด๊ฒŒ ์•„์ด์ฝ˜์˜ ์ƒ‰, ํฌ๊ธฐ ๋“ฑ ์š”์†Œ๋ฅผ ๋””์ž์ธ์— ๋”ฐ๋ผ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ํŒŒ์ผ ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์šฉ๋Ÿ‰์ด ๋งค์šฐ ์ž‘์•„์„œ ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ๊ฐ€ ์šฉ์ด ํ•ฉ๋‹ˆ๋‹ค. React.js ์™€ Next.js ๋ฐฉ๋ฒ•์€ ์ฐจ์ด๊ฐ€ ์กด์žฌ ํ•ฉ๋‹ˆ๋‹ค. โœ” ์‚ฌ์šฉ ์˜ˆ์‹œ React ํŒŒ์ผ ๊ฒฝ๋กœ : public/svg/icon.svg ( ์˜ˆ์‹œ ) fill ๊ณผ stroke ๊ฐ€ current ๋กœ ๋˜์–ด์žˆ๋Š”๋ฐ ์•„๋ž˜์—์„œ ์„ค๋ช… ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 1. img src import Icon from 'public/svg/icon.svg'; 2. svg ์ปดํฌ๋„ŒํŠธ๋กœ import { ReactComponent as icon } from 'public/svg/icon.svg'; ; โœ” svg ์ƒ‰, ํฌ๊ธฐ ๋ฐ”๊พธ๊ธฐ ์˜ˆ์‹œ๋Š” ์Šคํƒ€์ผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉ์„ ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ๋ฐฉ๋ฒ•์€ svg ์ฝ”..

๐Ÿ“ƒ Front-End/React.js

Styled-Components

styled components ๋Š” javascript์—์„œ css๋ฅผ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ์Šคํƒ€์ผ๋ง ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•˜๋Š” ์ด์œ  โœ” component ๋‹จ์œ„ ์Šคํƒ€์ผ๋ง ๊ธฐ์กด์˜ className์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๊ณผ ์ปดํฌ๋„ŒํŠธ์— ์Šคํƒ€์ผ์„ ์ ์šฉํ•˜์—ฌ ์Šคํƒ€์ผ ์ฝ”๋“œ๋ฅผ ๋ชฐ์•„ ๋„ฃ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ณตํ†ต ์ฝ”๋“œ๋ฅผ ์ค„์ด๊ณ  React์˜ ์ปดํฌ๋„ŒํŠธ ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. โœ” ์„ค์น˜ // styled-components ์„ค์น˜ํ•˜๊ธฐ $ npm install --save styled-components // yarn์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด $ yarn add styled-components โœ” ์‚ฌ์šฉ ์˜ˆ์‹œ const StyledDiv = styled.div` background-color: black; width: 100px; height: 1..

๐Ÿ“ƒ Front-End/React.js

ํ”„๋กœ์ ํŠธ ๋ฐฐํฌ ์ค€๋น„ ๋ฐ ๋นŒ๋“œ

โœ” ํ”„๋กœ์ ํŠธ ํƒ€์ดํ‹€ ๋ณ€๊ฒฝ public ํด๋” ์•ˆ์˜ index.html ๊ธฐ์กด HTML ํƒ€์ดํ‹€ ๋ณ€๊ฒฝ๊ณผ ๋™์ผํ•˜๊ฒŒ title ํƒœ๊ทธ ์ˆ˜์ • โœ” description ์ˆ˜์ • content ์ˆ˜์ • โœ” ์–ธ์–ด ์„ค์ • ํ•œ๊ตญ์–ด : ko ์˜์–ด : en ํŽ˜์ด์ง€ ๋งˆ๋‹ค ํƒ€์ดํ‹€ ๋ณ€๊ฒฝํ•˜๊ธฐ โœ” ๋ฆฌ์ŠคํŠธ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ํŽ˜์ด์ง€์ธ ๊ฒฝ์šฐ // ํƒ€์ดํ‹€ ๋ณ€๊ฒฝ useEffect(() => { const titleElement = document.querySelector('title'); titleElement.innerHTML = `๊ฐ์ • ์ผ๊ธฐ์žฅ - ${id}๋ฒˆ ์ผ๊ธฐ`; }, []); โœ” ๋นŒ๋“œ package.json ํŒŒ์ผ์— script ๋ถ€๋ถ„์— build ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๊ฒŒ ๋˜๋ฉด, ๋ฐฐํฌ ํ•  ์ˆ˜ ์žˆ๋Š” ์••์ถ•๋œ ํŒŒ์ผ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด์„œ ์„ฑ..

๐Ÿ“ƒ Front-End/React.js

React - img

App ์ปดํฌ๋„ŒํŠธ์— img ์‚ฝ์ž… โœ” ํ˜„์žฌ ํด๋” ๊ตฌ์กฐ โœ” App.js import './App.css'; import { BrowserRouter, Route, Routes } from 'react-router-dom'; import Home from './pages/Home'; import New from './pages/New'; import Edit from './pages/Edit'; import Diary from './pages/Diary'; function App() { return ( App.js ); } export default App; process.env.PUBLIC_URL ์€ ์–ด๋–ค ์œ„์น˜์— ์žˆ๋“  /public ์„ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค. โœ” ์ฐธ๊ณ  ์ธํ”„๋Ÿฐ

๐Ÿ“ƒ Front-End/React.js

React - Router ์‘์šฉ

Path Variable โ“ ๊ฒฝ๋กœ์˜ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉ URL์— ๋ณ€์ˆ˜๋ฅผ ๋‹ด์•„์„œ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ• useParams ์‚ฌ์šฉ โœ” ์—ฌ๋Ÿฌ ๊ฐ€์ง€์˜ ๊ฒŒ์‹œ๋ฌผ์„ ๋ฐ›๊ฒŒ๋˜๋Š” ๊ฒฝ์šฐ 1๋ฒˆ ๊ฒŒ์‹œ๋ฌผ์ธ์ง€, 2๋ฒˆ ๊ฒŒ์‹œ๋ฌผ์ธ์ง€ ..... n๋ฒˆ ๊ฒŒ์‹œ๋ฌผ์ธ์ง€ App.js import './App.css'; import { BrowserRouter, Route, Routes } from 'react-router-dom'; import RouteTest from './components/RouteTest'; import Home from './pages/Home'; import New from './pages/New'; import Edit from './pages/Edit'; import Diary from './pages/Diary'; function ..

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