4์ ํ ๋ฌ ๋์ ๋ฒ ํ ํ๋ก์ ํธ๋ฅผ ์ธํ
ํ๊ณ ๋ฐฐํฌ๊น์ง ๋ง๋ฌด๋ฆฌํ๋ค. โ๏ธ ํ๋ก์ ํธ ์๊ตฌ์ฌํญ์น ๊ธฐ๋ฐ ์๋น์ค์น UI ๋ด์์ ์นด๋ฉ๋ผ๋ฅผ ํตํด ์ฌ์ง ์ดฌ์์นด์นด์ค ๋งต์ด๋ ๊ตฌ๊ธ๋งต์ด ์๋ ์์ฒด ์ ์ํ ์ง๋ ์ด๋ฏธ์ง ์์ ํ์ผ๋ก ์์น๋ฅผ ํ์ํน์ ์์น์ ๋ํ ๋ฆฌ๋ทฐ ์์ฑ ๋ฐ ์ข์์ ๊ธฐ๋ฅ์ฌ์ฉ์ ํ๋ ๋ถ์์ ์ํ Mixpanel ์ฐ๋๐ค ์น์์ ์นด๋ฉ๋ผ ์ดฌ์์ด ๋๋ค๊ณ ?์ฒ์์๋ ์น UI์์์ ์นด๋ฉ๋ผ ์ดฌ์์ ํ ์ ์๋ ๊ฑด๊ฐ ํ๋ค..? ์ฐพ์๋ณด๋ ๊ฐ๋ฅํ๊ณ ๋๋ react-webcam์ ํ์ฉํด์ ๊ตฌํํ๋ค.์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ด๋ถ์ ์ผ๋ก ํ๊ทธ๋ฅผ ์ฌ์ฉํด ์นด๋ฉ๋ผ ํ๋ฉด์ ์ค์๊ฐ์ผ๋ก ๋ณด์ฌ์ค๋ค.๊ตฌ์ฒด์ ์ผ๋ก๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์ ๊ณตํ๋ ํ์ค Web API์ธ navigator.mediaDevices.getUserMedia()๋ฅผ ํธ์ถํด์ ์ฌ์ฉ์์ ์นด๋ฉ๋ผ ์คํธ๋ฆผ(strea..
REACT
useStateconst [state, setState] = useState(initialState)useState๋ ๋ฐฐ์ด์ ๋ฐํํ๊ณ ๋น๊ตฌ์กฐํ ํ ๋น์ ํตํด state, setState๋ฅผ ์ถ์ถํ์ฌ ์ฌ์ฉํ๋ค. ๊ทธ๋ ๋ค๋ฉด useState๋ ์ด๋์ ์ค๋ ๊ฒ์ผ๊น? ํจ์ํ ์ปดํฌ๋ํธ๋ ๋ ๋๋ง์ด ๋ฐ์ํ๋ฉด ํจ์ ์์ฒด๊ฐ ๋ค์ ํธ์ถ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด๋ป๊ฒ ํจ์๊ฐ ๋ค์ ํธ์ถ๋์์ ๋ ์ด์ ์ ์ํ๊ฐ์ ๊ฐ์ ธ์ฌ ์ ์๋ ๊ฒ์ธ๊ฐ?๋ฐ๋ก! useState๋ closure๋ก ๊ตฌํ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ด์ ์ ์ํ๊ฐ์ ์ ์งํ ์ ์๋ค!๊ทธ๋ ๋ค๋ฉด closure๋ ๋ฌด์์ธ๊ฐ? ์ด์ ๋ํด ๋จผ์ ํ์ธํด ๋ณด์! closure๋?mdn์ ๋ฐ๋ฅด๋ฉด ํจ์์ ๊ทธ ์ฃผ๋ณ ์ํ(lexical environment, ํจ์๊ฐ ์ ์๋ ๋ ์ฃผ๋ณ์ ์ค์ฝํ์ ๋ณ์์ ๋ํ ์ ๋ณด๋ฅผ ํฌํจํ..
์น ํ๋ ์์ํฌ์์ ์ฃผ๋ก ์ฐ์ด๋ react์ vue๋ฅผ ๋น๊ตํด ๋ณด๊ฒ ๋ค๊ทธ์ค์์๋ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ๊ณผ ๋ฐ์ดํฐ ํ๋ฆ ๋ฐฉ์์ ๋ํด ์์ธํ ์์๋ณด์!UI ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ๋ ์์ํฌ ๊ฐ๊ฐ ๊ณต์๋ฌธ์์ ๋ฐ๋ฅด๋ฉด react๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๊ณ vue๋ ํ๋ ์์ํฌ๋ก ์๊ฐ๋๊ณ ์๋ค.react๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๊ธฐ ๋๋ฌธ์ ๋ฆฌ์กํธ๋ง์ผ๋ก ์ ์ญ์ํ๊ด๋ฆฌ, ๋ผ์ฐํ
๋ฑ์ ์ง์ํ์ง ์๋๋ค. ์ฌ์ฉ์๊ฐ ๋ณ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐํ์ฌ ์ฌ์ฉํด์ผ ํ๋ค. vue๋ ํ๋ ์์ํฌ๋ก ์ฃผ์ด์ง ๋ฌธ๋ฒ์ ๋ฐ๋ผ ์ฌ์ฉํด์ผ ํ๋ค. ์ฝ๋ ํํreact๋ jsx๋ฅผ ์ฌ์ฉํ๊ณ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํตํด UI๋ก์ง๊ณผ DOM์ ๊ตฌํํ๋ค.vue๋ ์๋ html, {{ childData }} ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ด๋?ํ๋ฉด์์ ๋ณด์ด๋ ๋ฐ์ดํฐ์ ๋ธ๋ผ์ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์..
์
์ ์ฌ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉฐ ํ์ด์ง๋ค์ด์
๊ณผ ํจ๊ป ๋ง์ด ์ฐ์ธ ๊ฒ์ ํํฐ์ผ ๊ฒ์ด๋ค! ๊ฐ ํ์ด์ง์์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ธฐ ์ํด ํํฐ์ ํ์ด์ง๋ค์ด์
์ด ์ฌ์ฉ๋์๋ค. ๊ฐ๊ฐ์ ํ์ด์ง๋ง๋ค ํํฐ ์ปดํฌ๋ํธ๋ก ๋ง๋ค๋ฉด์ ๊ทธ์ ๋ํ ๋ก์ง์ด ๋ฐ๋ณต๋์ด ์ด๋ฅผ ๊ฐ์ ํ๊ณ ๋ค๋ก๊ฐ๊ธฐ ๋๋ ์๋ก๊ณ ์นจ ์ ํํฐ๊ฐ์ ์ ์งํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๊ฒ ๋ค! ํํฐ ์ปดํฌ๋ํธ์ ํํฐ ๊ด๋ จ hook ๊ตฌํํ๊ธฐ ํํฐ ์ปดํฌ๋ํธ ์ด๊ธฐ ํํฐ๊ฐ๋ค๊ณผ ๊ฒ์, ์ด๊ธฐํ ์ ๋์๋๋ ํจ์๋ฅผ ์ ๋ฌ ๋ฐ๋๋ค. ์ฌ์ฉ์๊ฐ ์
๋ ฅํ ํํฐ๊ฐ์ ๋ด๋ถ์ ์ผ๋ก ๊ด๋ฆฌํ๋ค. src/components/filter/deliveryTemplateFilter.tsx interface DeliveryTemplateFilterProps { initialFilterValues: FormState onSubmit: (filte..
์ง๋ ๊ธ์ ์ด์ด(Pagination comonent) ์ค๋์ Pagination component๋ฅผ ์ ๊ด๋ฆฌํ๊ธฐ ์ํ custom hook์ ๋ํด์ ์๊ฐํ๊ฒ ๋ค Pagination custom hook ๋ฐ๋ณต๋๋ ํ์ด์ง ๊ด๋ จ ์ํ๊ด๋ฆฌ ๋ก์ง์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ์ง? ์
์ ์ฌ ํ๋ก์ ํธ๋ฅผ ์งํ ์ค์ด์๊ธฐ ๋๋ฌธ์ ๊ฑฐ์ ๋ชจ๋ ํ์ด์ง์ ํ์ด์ง๋ค์ด์
์ด ๋ค์ด๊ฐ๋ค ์ด๋๋ง๋ค ํ์ด์ง ๊ด๋ จ ์ํ ๊ด๋ฆฌ ๋ก์ง์ด ์๊ฒจ๋ฌ๊ณ ๐ฅฒ ํ๋ ์๋ชป๋ ๋ก์ง์ด ์๋ค๋ฉด ๋ค๋ฅธ ๋ถ๋ถ๋ ์์ค ๊ฒ์ํด์ ๋๊ฐ์ด ์์ ํด์ค์ผ ํ๋ค ๋นํจ์จ์ ์ธ ์ผ์ ์์ ๊ณ ์ ํ์ด์ง๋ค์ด์
๊ด๋ จ ๋ก์ง์ ํ ๊ณณ์์ ํ ๋ฒ์ ๊ด๋ฆฌํ๊ธฐ ์ํด custom hook์ผ๋ก ๋ง๋ค์ด์ฃผ๊ธฐ๋ก ๊ฒฐ์ฌํ๋ค ๐ช ์ ์ฒด ์์ค src/hooks/usePageInfo.ts import { useRouter } from 'next..
๋ฆฌ์กํธ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด cdn์ ์ถ๊ฐํด์ค๋ค. ๊ฐ๋ฐ์ฉ ๋ฒ์ React์ ์ฉ๋ ๋ฐ ์ฑ๋ฅ ์ต์ ํ๋ ๋ฐฐํฌ์ฉ ๋ฒ์ ๋์ ๊ฒฝ์ฐ์๋ php ํ์ผ์ด๋ผ์ import React, { useState } from 'react';์ ๊ฐ์ ๋ฐฉ์์ผ๋ก useState๋ฅผ import ํ๋ ๊ฒ ๋ถ๊ฐ๋ฅํ๋ค. (ํน์ ๊ฐ๋ฅํ ๋ฐฉ๋ฒ์ด ์๋ค๋ฉด ์๋ ค์ฃผ์ธ์..ใ
ใ
) ๊ทธ๋์ useState๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ React.useState๋ก ์จ์ค์ผ ํ๋ค. ๋ฐ๋ฒจ ์ถ๊ฐํ๊ธฐ (php ํ์ผ์์ ๋ฆฌ์กํธ ์ฌ์ฉํ๋ ๋ฒ) ์๋์ ๊ฐ์ด ์ ๋์ํ๋ค! https://ko.reactjs.org/docs/cdn-links.html
ButtonTab์์ ํด๋ฆญ๋ ๋ฒํผ์ ๋ฐ๋ผ ์ด๊ธฐํ, ๋ชจ๋ ์์ดํ
์ด๋, ์ ํ๋ ์์ดํ
๋ง ์ด๋ํ๋๋ก ๊ตฌํํ๋ค. ์ด๊ธฐํ ํด๋ฆญ ์ availableOptions์ emojiMenus๋ฅผ ๋ฃ์ด์ฃผ๊ณ selectedOptions์ ๋น ๋ฐฐ์ด์ ๋ฃ์ด ์ด๊ธฐํ์์ผ์คฌ๋ค. ๋ชจ๋ ์์ดํ
์ด๋์ ํด๋ฆญ ์ spread ์ฐ์ฐ์๋ฅผ ํตํด availableOptions์ selectedOptions ๋ฐฐ์ด์ ๋ณํฉํด ์คฌ๋ค. moveAll(state, action) { if (action.payload === 'left') { // ๋ชจ๋ ์์ดํ
์ผ์ชฝ์ผ๋ก ์ด๋ state.availableOptions = [ ...state.availableOptions, ...state.selectedOptions, ]; state.selectedOptions =..
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์ ์ถ๊ฐํด..
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-..