REACT

ยท Project
4์›” ํ•œ ๋‹ฌ ๋™์•ˆ ๋ฒ ํƒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ์„ธํŒ…ํ•˜๊ณ  ๋ฐฐํฌ๊นŒ์ง€ ๋งˆ๋ฌด๋ฆฌํ–ˆ๋‹ค. โœ๏ธ ํ”„๋กœ์ ํŠธ ์š”๊ตฌ์‚ฌํ•ญ์›น ๊ธฐ๋ฐ˜ ์„œ๋น„์Šค์›น UI ๋‚ด์—์„œ ์นด๋ฉ”๋ผ๋ฅผ ํ†ตํ•ด ์‚ฌ์ง„ ์ดฌ์˜์นด์นด์˜ค ๋งต์ด๋‚˜ ๊ตฌ๊ธ€๋งต์ด ์•„๋‹Œ ์ž์ฒด ์ œ์ž‘ํ•œ ์ง€๋„ ์ด๋ฏธ์ง€ ์œ„์— ํ•€์œผ๋กœ ์œ„์น˜๋ฅผ ํ‘œ์‹œํŠน์ • ์œ„์น˜์— ๋Œ€ํ•œ ๋ฆฌ๋ทฐ ์ž‘์„ฑ ๋ฐ ์ข‹์•„์š” ๊ธฐ๋Šฅ์‚ฌ์šฉ์ž ํ™œ๋™ ๋ถ„์„์„ ์œ„ํ•œ Mixpanel ์—ฐ๋™๐Ÿค” ์›น์—์„œ ์นด๋ฉ”๋ผ ์ดฌ์˜์ด ๋œ๋‹ค๊ณ ?์ฒ˜์Œ์—๋Š” ์›น UI์•ˆ์—์„œ ์นด๋ฉ”๋ผ ์ดฌ์˜์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฑด๊ฐ€ ํ–ˆ๋‹ค..? ์ฐพ์•„๋ณด๋‹ˆ ๊ฐ€๋Šฅํ–ˆ๊ณ  ๋‚˜๋Š” react-webcam์„ ํ™œ์šฉํ•ด์„œ ๊ตฌํ˜„ํ–ˆ๋‹ค.์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด ์นด๋ฉ”๋ผ ํ™”๋ฉด์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณด์—ฌ์ค€๋‹ค.๊ตฌ์ฒด์ ์œผ๋กœ๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ œ๊ณตํ•˜๋Š” ํ‘œ์ค€ Web API์ธ navigator.mediaDevices.getUserMedia()๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์‚ฌ์šฉ์ž์˜ ์นด๋ฉ”๋ผ ์ŠคํŠธ๋ฆผ(strea..
ยท IT/React
useStateconst [state, setState] = useState(initialState)useState๋Š” ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ๋น„๊ตฌ์กฐํ™” ํ• ๋‹น์„ ํ†ตํ•ด state, setState๋ฅผ ์ถ”์ถœํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด useState๋Š” ์–ด๋””์„œ ์˜ค๋Š” ๊ฒƒ์ผ๊นŒ? ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•˜๋ฉด ํ•จ์ˆ˜ ์ž์ฒด๊ฐ€ ๋‹ค์‹œ ํ˜ธ์ถœ๋œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•จ์ˆ˜๊ฐ€ ๋‹ค์‹œ ํ˜ธ์ถœ๋˜์—ˆ์„ ๋•Œ ์ด์ „์˜ ์ƒํƒœ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ธ๊ฐ€?๋ฐ”๋กœ! useState๋Š” closure๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด์ „์˜ ์ƒํƒœ๊ฐ’์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค!๊ทธ๋ ‡๋‹ค๋ฉด closure๋ž€ ๋ฌด์—‡์ธ๊ฐ€? ์ด์— ๋Œ€ํ•ด ๋จผ์ € ํ™•์ธํ•ด ๋ณด์ž! closure๋ž€?mdn์— ๋”ฐ๋ฅด๋ฉด ํ•จ์ˆ˜์™€ ๊ทธ ์ฃผ๋ณ€ ์ƒํƒœ(lexical environment, ํ•จ์ˆ˜๊ฐ€ ์ •์˜๋  ๋•Œ ์ฃผ๋ณ€์˜ ์Šค์ฝ”ํ”„์™€ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜..
ยท IT
์›น ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์ฃผ๋กœ ์“ฐ์ด๋Š” react์™€ vue๋ฅผ ๋น„๊ตํ•ด ๋ณด๊ฒ ๋‹ค๊ทธ์ค‘์—์„œ๋„ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ๊ณผ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ๋ฐฉ์‹์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž!UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ”„๋ ˆ์ž„์›Œํฌ ๊ฐ๊ฐ ๊ณต์‹๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด react๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๊ณ  vue๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ์†Œ๊ฐœ๋˜๊ณ  ์žˆ๋‹ค.react๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌ์•กํŠธ๋งŒ์œผ๋กœ ์ „์—ญ์ƒํƒœ๊ด€๋ฆฌ, ๋ผ์šฐํŒ… ๋“ฑ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๋ณ„๋„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. vue๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ์ฃผ์–ด์ง„ ๋ฌธ๋ฒ•์— ๋”ฐ๋ผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.  ์ฝ”๋“œ ํ˜•ํƒœreact๋Š” jsx๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด UI๋กœ์ง๊ณผ DOM์„ ๊ตฌํ˜„ํ•œ๋‹ค.vue๋Š” ์—๋Š” html, {{ childData }}   ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์ด๋ž€?ํ™”๋ฉด์ƒ์— ๋ณด์ด๋Š” ๋ฐ์ดํ„ฐ์™€ ๋ธŒ๋ผ์šฐ์ € ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์„œ..
ยท IT/React
์ž…์ ์‚ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉฐ ํŽ˜์ด์ง€๋„ค์ด์…˜๊ณผ ํ•จ๊ป˜ ๋งŽ์ด ์“ฐ์ธ ๊ฒƒ์€ ํ•„ํ„ฐ์ผ ๊ฒƒ์ด๋‹ค! ๊ฐ ํŽ˜์ด์ง€์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด ํ•„ํ„ฐ์™€ ํŽ˜์ด์ง€๋„ค์ด์…˜์ด ์‚ฌ์šฉ๋˜์—ˆ๋‹ค. ๊ฐ๊ฐ์˜ ํŽ˜์ด์ง€๋งˆ๋‹ค ํ•„ํ„ฐ ์ปดํฌ๋„ŒํŠธ๋กœ ๋งŒ๋“ค๋ฉด์„œ ๊ทธ์— ๋Œ€ํ•œ ๋กœ์ง์ด ๋ฐ˜๋ณต๋˜์–ด ์ด๋ฅผ ๊ฐœ์„ ํ•˜๊ณ  ๋’ค๋กœ๊ฐ€๊ธฐ ๋˜๋Š” ์ƒˆ๋กœ๊ณ ์นจ ์‹œ ํ•„ํ„ฐ๊ฐ’์„ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๊ฒ ๋‹ค! ํ•„ํ„ฐ ์ปดํฌ๋„ŒํŠธ์™€ ํ•„ํ„ฐ ๊ด€๋ จ hook ๊ตฌํ˜„ํ•˜๊ธฐ ํ•„ํ„ฐ ์ปดํฌ๋„ŒํŠธ ์ดˆ๊ธฐ ํ•„ํ„ฐ๊ฐ’๋“ค๊ณผ ๊ฒ€์ƒ‰, ์ดˆ๊ธฐํ™” ์‹œ ๋™์ž‘๋˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌ ๋ฐ›๋Š”๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ํ•„ํ„ฐ๊ฐ’์„ ๋‚ด๋ถ€์ ์œผ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค. src/components/filter/deliveryTemplateFilter.tsx interface DeliveryTemplateFilterProps { initialFilterValues: FormState onSubmit: (filte..
ยท IT/React
์ง€๋‚œ ๊ธ€์— ์ด์–ด(Pagination comonent) ์˜ค๋Š˜์€ Pagination component๋ฅผ ์ž˜ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ custom hook์— ๋Œ€ํ•ด์„œ ์†Œ๊ฐœํ•˜๊ฒ ๋‹ค Pagination custom hook ๋ฐ˜๋ณต๋˜๋Š” ํŽ˜์ด์ง€ ๊ด€๋ จ ์ƒํƒœ๊ด€๋ฆฌ ๋กœ์ง์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜์ง€? ์ž…์ ์‚ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ ์ค‘์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฑฐ์˜ ๋ชจ๋“  ํŽ˜์ด์ง€์— ํŽ˜์ด์ง€๋„ค์ด์…˜์ด ๋“ค์–ด๊ฐ”๋‹ค ์ด๋•Œ๋งˆ๋‹ค ํŽ˜์ด์ง€ ๊ด€๋ จ ์ƒํƒœ ๊ด€๋ฆฌ ๋กœ์ง์ด ์ƒ๊ฒจ๋‚ฌ๊ณ  ๐Ÿฅฒ ํ•˜๋‚˜ ์ž˜๋ชป๋œ ๋กœ์ง์ด ์žˆ๋‹ค๋ฉด ๋‹ค๋ฅธ ๋ถ€๋ถ„๋„ ์†Œ์Šค ๊ฒ€์ƒ‰ํ•ด์„œ ๋˜‘๊ฐ™์ด ์ˆ˜์ •ํ•ด์ค˜์•ผ ํ–ˆ๋‹ค ๋น„ํšจ์œจ์ ์ธ ์ผ์€ ์—†์• ๊ณ ์ž ํŽ˜์ด์ง€๋„ค์ด์…˜ ๊ด€๋ จ ๋กœ์ง์„ ํ•œ ๊ณณ์—์„œ ํ•œ ๋ฒˆ์— ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด custom hook์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ๊ธฐ๋กœ ๊ฒฐ์‹ฌํ–ˆ๋‹ค ๐Ÿ’ช ์ „์ฒด ์†Œ์Šค src/hooks/usePageInfo.ts import { useRouter } from 'next..
ยท IT/React
๋ฆฌ์•กํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด cdn์„ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค. ๊ฐœ๋ฐœ์šฉ ๋ฒ„์ „ React์˜ ์šฉ๋Ÿ‰ ๋ฐ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋œ ๋ฐฐํฌ์šฉ ๋ฒ„์ „ ๋‚˜์˜ ๊ฒฝ์šฐ์—๋Š” php ํŒŒ์ผ์ด๋ผ์„œ import React, { useState } from 'react';์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ useState๋ฅผ import ํ•˜๋Š” ๊ฒŒ ๋ถˆ๊ฐ€๋Šฅํ–ˆ๋‹ค. (ํ˜น์‹œ ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”..ใ…Žใ…Ž) ๊ทธ๋ž˜์„œ useState๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” React.useState๋กœ ์จ์ค˜์•ผ ํ•œ๋‹ค. ๋ฐ”๋ฒจ ์ถ”๊ฐ€ํ•˜๊ธฐ (php ํŒŒ์ผ์—์„œ ๋ฆฌ์•กํŠธ ์‚ฌ์šฉํ•˜๋Š” ๋ฒ•) ์•„๋ž˜์™€ ๊ฐ™์ด ์ž˜ ๋™์ž‘ํ•œ๋‹ค! https://ko.reactjs.org/docs/cdn-links.html
ยท IT/React
ButtonTab์—์„œ ํด๋ฆญ๋œ ๋ฒ„ํŠผ์— ๋”ฐ๋ผ ์ดˆ๊ธฐํ™”, ๋ชจ๋“  ์•„์ดํ…œ ์ด๋™, ์„ ํƒ๋œ ์•„์ดํ…œ๋งŒ ์ด๋™ํ•˜๋„๋ก ๊ตฌํ˜„ํ–ˆ๋‹ค. ์ดˆ๊ธฐํ™” ํด๋ฆญ ์‹œ availableOptions์— emojiMenus๋ฅผ ๋„ฃ์–ด์ฃผ๊ณ  selectedOptions์— ๋นˆ ๋ฐฐ์—ด์„ ๋„ฃ์–ด ์ดˆ๊ธฐํ™”์‹œ์ผœ์คฌ๋‹ค. ๋ชจ๋“  ์•„์ดํ…œ ์ด๋™์„ ํด๋ฆญ ์‹œ spread ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด availableOptions์™€ selectedOptions ๋ฐฐ์—ด์„ ๋ณ‘ํ•ฉํ•ด ์คฌ๋‹ค. moveAll(state, action) { if (action.payload === 'left') { // ๋ชจ๋“  ์•„์ดํ…œ ์™ผ์ชฝ์œผ๋กœ ์ด๋™ state.availableOptions = [ ...state.availableOptions, ...state.selectedOptions, ]; state.selectedOptions =..
ยท IT/React
addComment: (state, action) => { // ์–ด๋А ๊ฒŒ์‹œ๊ธ€์— ํ•ด๋‹นํ•˜๋Š” ๋Œ“๊ธ€์ธ์ง€ ์ฐพ๊ธฐ ์œ„ํ•ด ๊ฒŒ์‹œ๊ธ€์˜ id๋ฅผ ๋ฐ›์•„์™€ filterํ•จ์ˆ˜๋กœ ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€ ์ฐพ๊ธฐ const currentReview = state.data.filter( (review) => review.postNumber === action.payload.postNumber, ); // ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€์— ์ƒˆ๋กœ์šด ๋Œ“๊ธ€ ์ถ”๊ฐ€ currentReview[0].comments.push(action.payload.newComment); }, addRecomment: (state, action) => { // ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€ ์ฐพ๊ธฐ const currentReview = state.data.filter( (review) => review.postNumbe..
์ƒˆ๋กœ์šด ํƒ€์ž… ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ด์šฉํ•œ ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ–ˆ๋‹ค. ํƒ€์ž… ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ณต์Šตํ•  ๊ฒธ ๊ธฐ์กด์˜ JavaScript๋กœ ๋งŒ๋“ค์—ˆ๋˜ ํ”„๋กœ์ ํŠธ๋ฅผ TypeScript๋กœ ๋ณ€๊ฒฝํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค. TypeScript๋ฅผ ์„ค์น˜ํ•œ๋‹ค. yarn add typescript @types/node @types/react @types/react-dom @types/jest // ๋˜๋Š” npm install typescript @types/node @types/react @types/react-dom @types/jest ๊ทธ๋‹ค์Œ yarn install // ๋˜๋Š” npm install tsconfig.jsonํŒŒ์ผ์ด ์ƒ์„ฑ๋œ๋‹ค. (ํ˜น์€ ์ƒ์„ฑ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด tsconfig.json์„ ์ตœ์ƒ๋‹จ์— ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.) ์•„๋ž˜ ์†Œ์Šค๋ฅผ tsconfig.json์— ์ถ”๊ฐ€ํ•ด..
ยท IT/React
ESLint ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ•์—์„œ ์—๋Ÿฌ๋ฅผ ์ฐพ์•„์ค€๋‹ค. Prettier ์ฝ”๋“œ ์Šคํƒ€์ผ์„ ์ž๋™์œผ๋กœ fotmattingํ•ด์ค€๋‹ค. ์ด ๋‘๊ฐ€์ง€๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ํ˜‘์—… ์‹œ ์ฝ”๋”ฉ ์Šคํƒ€์ผ์— ๋Œ€ํ•œ ๊ทœ์•ฝ์„ ์ง€ํ‚ฌ ์ˆ˜ ์žˆ๋‹ค! React์—์„œ ESLint์™€ Prettier ์„ค์ • React ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ npx create-react-app example CRA๋กœ ์ƒ์„ฑ๋œ ํ”„๋กœ์ ํŠธ๋Š” ์•ˆ์— ESLint๊ฐ€ ์ž๋™์œผ๋กœ ๋“ค์–ด๊ฐ„๋‹ค. ์ถ”๊ฐ€๋กœ ESLint๋ฅผ ์„ค์น˜ํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋‚˜๋‹ˆ ์ฃผ์˜! Prettier ์„ค์น˜ npm i prettier -D -E npm i eslint-plugin-prettier eslint-config-prettier -D Prettier์™€ ESLint๋ฅผ ํ•จ๊ป˜ ์“ฐ๊ธฐ ์œ„ํ•ด ์„ค์น˜ํ•ด์ค€๋‹ค. eslint-plugin-prettier eslint-..
์†”B
'REACT' ํƒœ๊ทธ์˜ ๊ธ€ ๋ชฉ๋ก