728x90
๋ฐ˜์‘ํ˜•

REACT 30

ESLint: Expected an assignment or function call and instead saw an expression

์—๋Ÿฌ ๋ฐœ์ƒ ์ฝ”๋“œ type ? (ref.current.style.marginTop = '0vh') : (ref.current.style.marginTop = '4vh'); type ๋”ฐ๋ผ์„œ marginTop์„ ์ปจํŠธ๋กคํ•˜๊ฒŒ ํ–ˆ๋Š”๋ฐ, ESLint: Expected an assignment or function call and instead saw an expression ํ•ด๋‹น ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐ ์ฝ”๋“œ if (type) ref.current.style.marginTop = '0vh'; else ref.current.style.marginTop = '4vh'; ์‚ผํ•ญ์—ฐ์‚ฐ์ž๊ฐ€ ์•„๋‹Œ if๋ฌธ์œผ๋กœ ํ•ด๊ฒฐํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์›๋ž˜ ์œ„์— if๋ฌธ์œผ๋กœ ์กฐ๊ฑด์ด ์ถ”๊ฐ€๋กœ ์žˆ์—ˆ๋Š”๋ฐ, ์•„๋งˆ ๊ทธ๊ฑฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•œ ์—๋Ÿฌ์ด์ง€ ์•Š์„๊นŒ ์‹ถ์Šต๋‹ˆ๋‹ค.

Next.js] ํ”„๋กœ์ ํŠธ ํด๋” ๊ตฌ์กฐ

๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ํ”„๋กœ์ ํŠธ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜๋ฉด ์‚ฌ์ง„๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ์˜ต์…˜์œผ๋กœ ์‚ฌ์ง„๊ณผ ๊ฐ™์ด ์„ค์ •ํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. Next 13 ๋ฒ„์ „๋ถ€ํ„ฐ ์ƒ๊ธด app router๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. (์ด์ „ ๋ฒ„์ „ ๊นŒ์ง€๋Š” ๋ณดํ†ต pages๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ผ์šฐํŒ…์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.) npx create-next-app@latest ์ด๋ ‡๊ฒŒ ์ƒ์„ฑ๋œ ํด๋” ๊ตฌ์กฐ์—์„œ ์ƒ์„ฑ๋œ ํŒŒ์ผ์„ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Layout.tsx ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋กœ ์„ค์น˜ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— tsxํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ํŒŒ์ผ์€ ๊ธฐ๋ณธ์ ์ด ํ”„๋กœ์ ํŠธ, ์›นํŽ˜์ด์ง€์˜ ๊ณจ๊ฒฉ์ด๋ผ๊ณ  ๋ณด์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. _app์ด๋ž‘ ๋น„์Šทํ•œ๊ฐ€? ์‹ถ์Šต๋‹ˆ๋‹ค. import './globals.css' import type { Metadata } from 'next' import { Inter } from 'next/font/goo..

Front-End/Next.js 2023.08.15

Next.js] Next.js ์„ค์น˜ ๋ฐ ์‹œ์ž‘, ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ (Insallation)

๊ณตํ™ˆ์„ ๋ณด๋ฉด์„œ ํ•˜๋‚˜์”ฉ ์ •๋ฆฌํ•ด ๋‚˜๊ฐ€๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์‹œ์ž‘์ธ Next.js ์„ค์น˜๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. https://nextjs.org/ ์ผ๋‹จ ์ œ์ผ ๋จผ์ € Node.js๊ฐ€ ์„ค์น˜ ๋˜์–ด์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. React๊ฐœ๋ฐœ์ž๋ฉด ๋‹น์—ฐํžˆ ์„ค์น˜ ๋ผ์žˆ์„ ๊ฒƒ์œผ๋กœ ์ƒ๊ฐ ๋“ญ๋‹ˆ๋‹ค.(16.8 ๋ฒ„์ „ ์ด์ƒ์ด๋ผ๊ณ  ์•ˆ๋‚ด๋˜์–ด ์žˆ๋„ค์š”) ์ž๋™์„ค์น˜ npx create-next-app@latest ์œ„ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์ œ์ผ ์ตœ์‹  ๋ฒ„์ „์˜ Next.js๊ฐ€ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค. What is your project named? my-app Would you like to use TypeScript? No / Yes Would you like to use ESLint? No / Yes Would you like to use Tailwind CSS? No / Yes W..

Front-End/Next.js 2023.08.09

Next.js] Next.js๋ž€?

next.js๋Š” React ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ๋ฐ˜๋“œ์‹œ ์•Œ์•„์•ผ ํ•˜๋Š” ํ”„๋ ˆ์ž„ ์›Œํฌ์ž…๋‹ˆ๋‹ค. ์ˆœ์ˆ˜ React๋Š” ์˜คํžˆ๋ ค ์•ˆ ์“ฐ๊ณ , React์— Next.js๋ฅผ ์–น์–ด์„œ ์ฃผ๋กœ ๊ฐœ๋ฐœํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•œ๋‹ค๊ณ  ๋ณด์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด Next.js๋ž€ ๋ฌด์—‡์ธ์ง€๋ถ€ํ„ฐ ํ•ด์„œ ๊ฐ™์ด ๊ณต๋ถ€๋ฅผ ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ํ•  ๋•Œ ๊ณ„์†ํ•ด์„œ ์‚ฌ์šฉํ•˜๊ณ ๋Š” ์žˆ์ง€๋งŒ, ๋”ฑํžˆ ๊ณต๋ถ€๋ฅผ ํ•ด์„œ ์•Œ๊ณ ์„œ ์‚ฌ์šฉํ•˜๊ธฐ๋ณด๋‹ค๋Š” ๊ทธ๋•Œ๊ทธ๋•Œ ๋งž์ถฐ์„œ ์ฐพ์•„๋ณด๊ณ  ํ–ˆ๋˜ ํ„ฐ๋ผ ์ด๋ฒˆ๊ธฐํšŒ์— ์ •๋ฆฌํ•  ๊ฒธ ๊ณต๋ถ€ํ•  ๊ฒธ ๊ฒธ์‚ฌ๊ฒธ์‚ฌ ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. Next.js๋ž€? React๋กœ ๋งŒ๋“  ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(SSR) ํ”„๋ ˆ์ž„ ์›Œํฌ์ž…๋‹ˆ๋‹ค. ์ •ํ™•ํžˆ๋Š” SSG์— ๊ตฌ๋ถ„๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. CSR์ธ Reactํ™˜๊ฒฝ์—์„œ SSR๊ธฐ๋Šฅ์„ ๊ตฌ์‚ฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ค๋‹ˆ๋‹ค. SSR์˜ ํŠน์ƒ‰์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋งŒ์•ฝ ๋ฆฌ์†Œ์Šค๊ฐ€ ํฐ ํŽ˜์ด์ง€๊ฐ€ ์žˆ๊ฑฐ๋‚˜,..

Front-End/Next.js 2023.08.06

Library] swagger-ui-react

ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ ์ค‘์— BE ๋‹ด๋‹น์ž๊ฐ€ swagger๋ฅผ ์„œ๋ฒ„์— ์˜ฌ๋ ค์ฃผ์ง€ ์•Š๊ณ , yaml ํŒŒ์ผ๋กœ ์ „๋‹ฌ ์ค˜์„œ ๋ถˆํŽธํ•จ์„ ๊ฒช๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. swaggerํ™ˆํŽ˜์ด์ง€ ์—ด์–ด์„œ yamlํŒŒ์ผ์„ importํ•ด๋„ ๋˜์ง€๋งŒ, ๋”ฐ๋กœ ํŽ˜์ด์ง€๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ๋ณด๊ณ ์žํ•˜๋Š” ๋ชฉ์ ์— ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋์Šต๋‹ˆ๋‹ค. https://www.npmjs.com/package/@types/swagger-ui-react ์„ค์น˜ npm i @types/swagger-ui-react ํ™ˆํŽ˜์ด์ง€ ๋‚˜์™€์žˆ๋Š”๋Œ€๋กœ npm ์„ค์น˜ ์‚ฌ์šฉ๋ฒ• import SwaggerUI from 'swagger-ui-react'; import 'swagger-ui-react/swagger-ui.css'; export default function Swagger() { const url = 'ํด๋”..

Front-End/Library 2023.07.07

Error] formํƒœ๊ทธ submit ์‹œ, ํŽ˜์ด์ง€ ์ด๋™ ๋ง‰๊ธฐ

React์—์„œ formํƒœ๊ทธ ์ž‘์„ฑ ํ›„, button type์„ submit์„ ์ฃผ๊ณ  ์‹คํ–‰ํ–ˆ๋Š”๋ฐ ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ๋กœ์ง๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๊ณ , formํƒœ๊ทธ ์•ˆ์— inputํƒœ๊ทธ๋“ค์˜ ๊ฐ’๋“ค์€ ์ดˆ๊ธฐํ™”๋˜๊ณ , ํŽ˜์ด์ง€๋Š” ๊ทธ๋Œ€๋กœ ์žˆ๋Š” ํ˜„์ƒ์„ ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒ๋‹ˆ๋‹ค. ์›์ธ formํƒœ๊ทธ์—์„œ submit์ด ์ž‘๋™ํ•˜๋ฉด, action์†์„ฑ์— ์ง€์ •๋œ url๋กœ request ํ•˜์—ฌ ํ•ด๋‹น ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด ๊ธฐ๋ณธ ๋™์ž‘์ž…๋‹ˆ๋‹ค. React ๊ฐœ๋ฐœ์ž(SPA)๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ƒˆ๋กœ๊ณ ์นจ ๋˜๋Š” ํ˜„์ƒ์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ง์ ‘ ์ž‘์„ฑํ•œ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋กœ์ง์ด ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ์›ํ•  ๊ฒ๋‹ˆ๋‹ค. ํ•ด๊ฒฐ๋ฐฉ๋ฒ• ์œ„์—์„œ ์„ค๋ช…ํ•œ submit๊ธฐ๋ณธ๋™์ž‘์€ ํ•„์š” ์—†์Œ์œผ๋กœ event.preventDefault()๋ฅผ ์ค˜์„œ request๋ฅผ ๋ง‰์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ submit ๋™์ž‘์„ ๋ง‰์•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌํ˜„ํ•œ ๋Œ€๋กœ ๋™..

Library] SWR : ์‘์šฉ_Pagination & InfiniteScroll(useSWRInfinite)

์ผ๋ฐ˜์ ์ธ pagenation์€ ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•˜๊ณ , useSWRInfinite์— ๋Œ€ํ•ด ์†Œ๊ฐœํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. https://swr.vercel.app/ko/docs/pagination Pagination ๊ธฐ๋ณธ pagination์€ useSWRInfinite๋ฅผ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. function Page ({ index }) { const { data } = useSWR(`/api/data?page=${index}`, fetcher); // ... ๋กœ๋”ฉ ๋ฐ ์—๋Ÿฌ ์ƒํƒœ๋ฅผ ์ฒ˜๋ฆฌ return data.map(item => {item.name}) } function App () { const [pageIndex, setPageIndex] = useState(0); return setPageIndex(pageIndex..

Front-End/Library 2023.07.04

Library] SWR : ์‘์šฉ_Mutate & Revalidation

Mutate mutate๋Š” ์›๊ฒฉ ๋ฐ์ดํ„ฐ ๋ฐ ์บ์‹ฑ๋œ ๊ฐ’์„ ๋ณ€๊ฒฝ, ๊ฐฑ์‹ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ณณ์—์„œ ํ•ด๋‹นํ•˜๋Š” ํ‚ค๊ฐ’์— ๋ฐ์ดํ„ฐ๋ฅผ post๋‚˜ delete, patch ๋“ฑ ์ž‘์—…์ด ์ผ์–ด๋‚ฌ์„ ๊ฒฝ์šฐ, ์บ์‹ฑ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐฑ์‹ ํ•ด์•ผ ๋  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค๊ณ  ๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค. (revalidation) Global๊ณผ Bound ๋‘ ๊ฐ€์ง€๋กœ ๋‚˜๋ˆ ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. Global Mutate useSWRConfig ๋˜๋Š” swr์„ import ํ•ด์„œ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. import { useSWRConfig } from "swr" function App() { const { mutate } = useSWRConfig() mutate(key, data, options) } /////////////////////////////////////// impor..

Front-End/Library 2023.07.03

Library] SWR : ์‘์šฉ

2023.07.03 - [Front-End/Library] - Library] SWR ์ €๋ฒˆ ๊ฒŒ์‹œ๊ธ€์— ์ด์–ด์„œ SWR ์—ฌ๋Ÿฌ ๊ฐœ๋…? ๊ธฐ๋Šฅ? ๋“ค์„ ์„ค๋ช…ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ „์—ญ์„ค์ • ๋งŒ์•ฝ SWR์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ fetcher๊ฐ€ ์ค‘๋ณต๋œ๋‹ค๋ฉด ๊ณ ๋ คํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„ ๋“ฏํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. import useSWR, { SWRConfig } from 'swr' function Dashboard () { const { data: events } = useSWR('/api/events') const { data: projects } = useSWR('/api/projects') const { data: user } = useSWR('/api/user', { refreshInterval: 0 }) // ์˜ค๋ฒ„๋ผ์ด๋“œ // ... } funct..

Front-End/Library 2023.07.03

Library] SWR

SWR(Stale-While-Revalidate) swr์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•œ React hook ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋ณด์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์— GET์š”์ฒญ์„ ํ•˜๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„์™€ ๊ฐ„ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ axios๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํšจ์œจ์ด ์ข‹๋‹ค๊ณ  ๋ณด์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์ธ ํŠน์ง•์œผ๋กœ ๋น ๋ฅด๊ณ , ๊ฐ€๋ณ๊ณ , ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. ๋‚ด์žฅ๋œ ์บ์‹œ ๋ฐ ์š”์ฒญ ์ค‘๋ณต์„ ์ œ๊ฑฐ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋™์ž‘ 3๊ฐ€์ง€๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์„ ๋“ฏํ•ฉ๋‹ˆ๋‹ค. (์ €๋Š” ์บ์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์ค‘๋ณต์œผ๋กœ ์š”์ฒญ์„ ์•ˆ ํ•œ๋‹ค๋Š” ๊ฒŒ ํฐ ์žฅ์ ์œผ๋กœ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.) ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. https://swr.vercel.app/ko ์„ค์น˜ npm i swr yarn add swr ๊ธฐ๋ณธ ๊ตฌ์„ฑ const { data, error, isLoading, isV..

Front-End/Library 2023.07.03
728x90
๋ฐ˜์‘ํ˜•