๐Ÿ“ƒ Front-End

๐Ÿ“ƒ Front-End/React.js

React์—์„œ API ํ˜ธ์ถœ

https://jsonplaceholder.typicode.com/ ์„ ์‚ฌ์šฉ ๋ฌด๋ฃŒ๋กœ API ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•ด์„œ Test ๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ค API ๋กœ ์ž์›์„ ๊ฐ€์ ธ๋‹ค ์“ธ ์ˆ˜ ์žˆ๋Š”์ง€ ๋ชฉ๋ก ์—ฌ๊ธฐ์„œ๋Š” /comments ์‚ฌ์šฉ API ๋ฅผ ํ˜ธ์ถœํ•˜๋ ค๋ฉด ํ•ด๋‹น API์˜ ์ฃผ์†Œ๋ฅผ ์•Œ์•„์•ผ ํ•˜๋Š”๋ฐ ์œ„์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ํด๋ฆญํ•˜๊ณ  ๋“ค์–ด๊ฐ„ URL ์ž…๋‹ˆ๋‹ค. ( https://jsonplaceholder.typicode.com/comments ) โœ” App.js ํ˜ธ์ถœํ•˜๋Š” ์‹œ์  : App.js ์ปดํฌ๋„ŒํŠธ๊ฐ€ Mount ํ•˜๋ฉด ํ˜ธ์ถœ function App() { const getData = async () => { const res = await fetch( 'https://jsonplaceholder.typicode.com/comments..

๐Ÿ“ƒ Front-End/React.js

useEffect

ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ useEffect ๋ฅผ ์ด์šฉํ•ด์„œ Lifecycle ๋ฅผ ๊ด€๋ฆฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. โœ” ์‚ฌ์šฉ๋ฒ• import React, { useEffect } from "react"; useEffect ๋ฅผ ์‚ฌ์šฉ ํ•ฉ๋‹ˆ๋‹ค. 2๊ฐœ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ฒŒ ๋˜๋Š”๋ฐ 1. callback ํ•จ์ˆ˜, 2. ์˜์กด์„ฑ ๋ฐฐ์—ด ์„ ์ „๋‹ฌ ํ•ฉ๋‹ˆ๋‹ค. ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ๋Ž์Šค๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์˜์กด์„ฑ ๋ฐฐ์—ด์— ๋“ค์–ด์žˆ๋Š” ๊ฐ’ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๋ณ€ํ™”ํ•˜๋ฉด, ์ฒซ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ์ธ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ๋‹ค์‹œ ์ˆ˜ํ–‰ ์˜ˆ์‹œ โœ” Lifecycle.js import React, { useEffect, useState } from 'react'; const Lifecycle = () => { const [count, setCount] = useState(0); const [text,..

๐Ÿ“ƒ Front-End/React.js

React Lifecycle

React ์˜ ์ƒ๋ช…์ฃผ๊ธฐ Lifecycle โ“ ์ƒ์• ์ฃผ๊ธฐ ( Lifecycle ) ์ผ๋ฐ˜์ ์œผ๋กœ ์‹œ๊ฐ„์— ํ๋ฆ„์— ๋”ฐ๋ผ, ํƒ„์ƒ๋ถ€ํ„ฐ ์ฃฝ์Œ์— ์ด๋ฅด๋Š” ์ˆœ๊ฐ„์— ๋”ฐ๋ฅธ ๋‹จ๊ณ„์ ์ธ ๊ณผ์ • ์ถœ์ฒ˜ : ๊ตญ๋ฏผ ์•ˆ์ •์ฒ˜ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์—์„œ๋„ Lifecycle ์ด๋ผ๋Š” ๋‹จ์–ด๊ฐ€ ๋งŽ์ด ์‚ฌ์šฉ ๋˜๋Š”๋ฐ ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๊ณ , ์ข…๋ฃŒ๋˜๋Š” ๊ณผ์ •์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ ํ•ฉ๋‹ˆ๋‹ค. โœ” React ์ปดํฌ๋„ŒํŠธ์˜ Lifecycle ํƒ„์ƒ : ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒƒ ( React ์—์„œ Mount ๋ผ๊ณ  ์ง€์นญ ) ๋ณ€ํ™” : state ๊ฐ€ ๋ฐ”๋€Œ๊ฑฐ๋‚˜, ์—…๋ฐ์ดํŠธ(๋ฆฌ๋ Œ๋”) ๋˜๊ฑฐ๋‚˜ ์ด๋Ÿฐ ๋ณ€ํ™”๋“ค ( Update ) ์ฃฝ์Œ : ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ™”๋ฉด์—์„œ ์‚ฌ๋ผ์ง€๊ฒŒ ๋˜๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ( React ์—์„œ UnMount ๋ผ๊ณ  ์ง€์นญ ) ์ฆ‰, React ์—์„œ ์ œ์ž‘ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋“ค์˜ ํƒ„์ƒ ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด..

๐Ÿ“ƒ Front-End/React.js

๋ฆฌ์ŠคํŠธ ๋ฐ์ดํ„ฐ ์ˆ˜์ •ํ•˜๊ธฐ

โœ” DiaryItem.js ์ƒ์„ฑ๋˜๋Š” ๋ฆฌ์ŠคํŠธ์˜ ์•„์ดํ…œ์— ๋ฒ„ํŠผ์„ ์ถ”๊ฐ€ const DiaryItem = ({ onRemove, author, content, create_date, emotion, id }) => { const handleRemove = () => { if (window.confirm(`${id}๋ฒˆ์งธ ์ผ๊ธฐ๋ฅผ ์‚ญ์ œ ํ•˜๊ฒ ์Šต๋‹ˆ๊นŒ?`)) { onRemove(id); } }; return ( ์ž‘์„ฑ์ž : {author} | ๊ฐ์ •์ ์ˆ˜ : {emotion} {new Date(create_date).toLocaleString()} {content} ์‚ญ์ œํ•˜๊ธฐ ์ˆ˜์ •ํ•˜๊ธฐ ); }; export default DiaryItem; ์ „๋ฐ˜์ ์ธ ๊ฐ€๋…์„ฑ์„ ๊ณ ๋ คํ•ด ๊ธฐ์กด onRemove ํ•จ์ˆ˜๋ฅผ return ์œ„์— ๋”ฐ๋กœ ์ •์˜ ํ•˜์˜€์Šต..

๐Ÿ“ƒ Front-End/React.js

๋ฆฌ์ŠคํŠธ ๋ฐ์ดํ„ฐ ์‚ญ์ œํ•˜๊ธฐ

์ถ”๊ฐ€ ํ•  ๋•Œ์™€ ๋น„์Šทํ•˜๊ฒŒ ์ƒ์œ„์˜ data ๋ฅผ ๋ฐ”๊ฟ”์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‚ญ์ œ๋ฅผ ํ•˜๋ฉด ์‚ญ์ œ๋ฅผ ํ•œ ๋ฐฐ์—ด๋กœ data ์˜ state ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ˆœ์„œ โœ” ์ƒ์„ฑ๋˜๋Š” ๋ฆฌ์ŠคํŠธ์˜ ์•„์ดํ…œ์— ๋ฒ„ํŠผ์„ ์ถ”๊ฐ€ ( DiaryItem.js ) const DiaryItem = ({ author, content, create_date, emotion, id }) => { return ( ์ž‘์„ฑ์ž : {author} | ๊ฐ์ •์ ์ˆ˜ : {emotion} {new Date(create_date).toLocaleString()} {content} { console.log(id); }} > ์‚ญ์ œํ•˜๊ธฐ ); }; export default DiaryItem; onClick() ์ด๋ฒคํŠธ ๊นŒ์ง€ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค. ํ˜„์žฌ ์œ„์˜ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๊ฐ€์žฅ ์ตœ์‹  ์•„์ดํ…œ์˜..

๐Ÿ“ƒ Front-End/React.js

๋ฆฌ์ŠคํŠธ ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ํ•˜๊ธฐ

React ๋Š” ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ๋ฐ์ดํ„ฐ๊ฐ€ ํ๋ฆ…๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ฐ™์€ ๋ ˆ๋ฒจ์— ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ ๋Š” ์„œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตํ™˜ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ ๊ณตํ†ต ๋ถ€๋ชจ์š”์†Œ๋กœ ๋Œ์–ด์˜ฌ๋ ค์„œ ํ•ด๊ฒฐ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. โœ” ๊ตฌ์กฐ ๊ฐ™์€ ๋ ˆ๋ฒจ์ด๋ผ ํ•จ์€ DiaryEditor ์™€ DiaryList ์ž…๋‹ˆ๋‹ค. ๊ณตํ†ต ๋ถ€๋ชจ์ธ App ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฐ์—ด ํ˜•์‹์˜ state ๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค. data state ์˜ ๊ฐ’์„ DiaryList ์—๊ฒŒ ์ „๋‹ฌํ•˜๋ฉด์„œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ Œ๋”๋ง ํ•˜๊ฒŒ ํ•˜๊ณ  data state ๋ฅผ ๋ณ€ํ™” ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๋ณ€ํ™” ํ•จ์ˆ˜์ธ setData ๋ฅผ DiaryEditor ์—๊ฒŒ props ์œผ๋กœ ์ „๋‹ฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. โœ” ์‹œ๋ฎฌ๋ ˆ์ด์…˜ data state ๋Š” ๋ฐฐ์—ด์ด๊ณ  [itme1] ํ•˜๋‚˜์˜ ์•„์ดํ…œ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ƒํƒœ ์ž…๋‹ˆ๋‹ค. data ๋ฅผ props ๋กœ ๋‚ด๋ ค๋ฐ›์€ Dia..

๐Ÿ“ƒ Front-End/React.js

React - ๋ฆฌ์ŠคํŠธ ๋ Œ๋”๋ง ( ์กฐํšŒ )

๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ์ŠคํŠธ ๋ Œ๋”๋ง์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. React ์—์„œ ๋ฐฐ์—ด์€ ๊ฒŒ์‹œ๊ธ€, ๋ฆฌ์ŠคํŠธ, ํ”ผ๋“œ ๋“ฑ์„ ํ‘œ์‹œ ํ•˜๋Š” ๊ฒฝ์šฐ ์ž์ฃผ ์‚ฌ์šฉ ๋ฉ๋‹ˆ๋‹ค. ์ˆœ์„œ โœ” App.js ์—์„œ ๋นˆ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค. const dummyList ๋ถ€๋ถ„ props ์„ ์‚ฌ์šฉํ•ด์„œ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ ํ•ฉ๋‹ˆ๋‹ค. { console.log(diaryList); return ( ์ผ๊ธฐ ๋ฆฌ์ŠคํŠธ {diaryList.length}๊ฐœ์˜ ์ผ๊ธฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. {diaryList.map((it) => ( // key prop ์„ ๋งŒ๋“ค๋ผ๊ณ  ์—๋Ÿฌ๊ฐ€ ๋œจ๋Š” ๊ฒฝ์šฐ (ํ•ด๊ฒฐ) ์ž‘์„ฑ์ž : {it.author} ์ผ๊ธฐ : {it.content} ๊ฐ์ • : {it.emotion} ์ž‘์„ฑ ์‹œ๊ฐ„(ms) : {it.create_date} ))} ); }; export defau..

๐Ÿ“ƒ Front-End/React.js

useRef

useRef โ“ DOM ์š”์†Œ๋ฅผ ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ DOM ? HTML๊ณผ JavaScript๋ฅผ ์ด์–ด์ฃผ๋Š” ๊ณต๊ฐ„์œผ๋กœ, ์ž‘์„ฑํ•œ HTML์„ JavaScript๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก Object๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ ์ถœ์ฒ˜ : https://www.howdy-mj.me/dom/what-is-dom/ ์ €์žฅ๊ณต๊ฐ„ (๋ณ€์ˆ˜๊ด€๋ฆฌ) ๋กœ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 1. DOM ์š”์†Œ์— ์ ‘๊ทผ ๋ฐ”๋‹๋ผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ document.querySelector() ์™€ ๋น„์Šท ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์‹œ๋Š”, ๋กœ๊ทธ์ธ ํ™”๋ฉด์ด ๋‚˜์™”์„ ๋•Œ id๋ฅผ ๋„ฃ๋Š” input์„ ๊ตณ์ด ํด๋ฆญํ•˜์ง€ ์•Š์•„๋„ ์ž๋™์œผ๋กœ ํฌ์ปค์Šค๊ฐ€ ๋˜์–ด ์žˆ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๊ณ , ์—˜๋ฆฌ๋จผํŠธ์˜ ํฌ๊ธฐ๋‚˜ ์ƒ‰์ƒ์„ ๋ณ€๊ฒฝํ•  ๋•Œ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅ ํ•ฉ๋‹ˆ๋‹ค. 2. ์ €์žฅ ๊ณต๊ฐ„ ์ €์žฅ๊ณต๊ฐ„์ด๋ผ ํ•˜๋ฉด ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” state๋ฅผ ์‚ฌ์šฉ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ React..

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