๐ Front-End/React.js
์ฝ๋ ๊ตฌ์กฐ โ 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 ์ ์๋ฒ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์
๋๋ค. Client State vs Server State โ โ Client State ํด๋ผ์ด์ธํธ ์ํ๋, ์น ๋ธ๋ผ์ฐ์ ์ธ์
๊ณผ ๊ด๋ จ๋ ๋ชจ๋ ์ ๋ณด๋ฅผ ์๋ฏธ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ฌ์ฉ์๋ ๊ฐ์ฅ ์ ์๋ ์ธ์ด๋ก ํ
์คํธ๋ฅผ ์ฝ๊ธฐ ์ํด, ์ธ์ด๋ฅผ ์ ํํ๊ฑฐ๋ ํ
๋ง๋ฅผ ๋ฐ์ ์์ด๋, ์ด๋์ด ์์ผ๋ก ๋ณ๊ฒฝ ํ ์ ์๋๋ฐ ์ด๋ฐ ๊ฒ์ ์๋ฒ์์ ์ผ์ด๋๋ ์ผ๊ณผ๋ ์๋ฌด ๊ด๋ จ์ด ์์ต๋๋ค. ๋จ์ํ ์ฌ์ฉ์์ ์ํ๋ฅผ ์ถ์ ํ๋ ๊ฒ ์
๋๋ค. โ Server State ์๋ฒ ์ํ๋, ์๋ฒ์ ์ ์ฅ๋์ง๋ง ํด๋ผ์ด์ธํธ์ ํ์ํ๋๋ฐ ํ์ํ ๋ฐ์ดํฐ ์
๋๋ค. ์๋ฅผ ๋ค์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋๋ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ ๋ฐ์ดํฐ๊ฐ ์ด์ ํด๋น ํฉ๋๋ค. ์ฌ์ฉ์์ ๊ฒ์๋ฌผ์ ํ์ํ๊ธฐ ์ํด ํด๋ผ์ด์ธํธ์ ๋ฐ์ดํฐ๊ฐ ์์ด์ผ ํ์ง๋ง, ๋ฐ์ดํฐ๋ ..
๐ Front-End/React.js
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
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 ๋ 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
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
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 ..