Programming/React 34

์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ Recoil

https://youtu.be/T4QSK3Un4rU?si=mbvxspFCiOsg3VFW  State management์ „์—ญ์ ์ธ ์ƒํƒœ๋ฅผ ๋งŒ๋“œ๋Š” ๋„๊ตฌ const [count, setCount] = useState(10);์ด ์ƒํƒœ๋Š” ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.  ๋ฆฌ์•กํŠธ์—์„œ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ณผ์ •์€ ์†Œ๋ฌธ์ด ํผ์ ธ ๋‚˜๊ฐ€๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜๋‹ค. ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ props๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ, ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด ๊ด€๋ จ ์—†๋Š” ์ปดํฌ๋„ŒํŠธ๋„ ์ „๋‹ฌ์ž๊ฐ€ ๋˜์–ด์•ผ ํ•˜๊ณ  ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•œ๋‹ค.  State management๋Š” ๋ฐฉ์†ก๊ตญ์ด๋‹ค. ๊ด€๋ จ๋œ ์ปดํฌ๋„ŒํŠธ๋“ค์ด management๋ฅผ ๊ตฌ๋…ํ•œ๋‹ค. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ๊ตฌ๋… ์ค‘์ธ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ํ†ต๋ณด๋ฅผ ๋ฐ›๊ฒŒ ๋˜๊ณ , ๊ฐ์ž ๋ Œ๋”๋ง์ด ์‹œ์ž‘๋œ๋‹ค.     import ..

Programming/React 2024.12.19

[ AGGRID ] ๊ทธ๋ฆฌ๋“œ ํ–‰ ์ถ”๊ฐ€, ์‚ญ์ œ์‹œ ๋งจ ์œ„๋กœ ์Šคํฌ๋กค ๋˜๋Š” ํ˜„์ƒ ํ•ด๊ฒฐ

'-' ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ํ•ด๋‹น ํ–‰์ด ์‚ญ์ œ ๋˜๊ณ ,'+' ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ํ•ด๋‹น ํ–‰ ๋ฐ‘์— ํ–‰์ด ์ถ”๊ฐ€ ๋˜๋Š” ๋กœ์ง์„ ๋งŒ๋“ค์—ˆ๋‹ค.  ๊ทธ๋Ÿฐ๋ฐ, ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์„œ ๋ฐ์ดํ„ฐ์…‹์— ๋ณ€ํ™”๊ฐ€ ์ƒ๊ธฐ๋ฉด ์Šคํฌ๋กค์ด ๊ณ„์† ์œ„๋กœ๊ฐ€๋Š” ํ˜„์ƒ์ด ์žˆ์—ˆ๋‹ค.     ์ € ํ–‰๋“ค์€ ๊ทธ๋ฆฌ๋“œ์˜ ์•„๋ž˜์ชฝ์— ํฌ์ง€์…˜๋˜์–ด ์žˆ๋Š”๋ฐ, ์ถ”๊ฐ€๋˜๋ฉด ์Šคํฌ๋กค์ด ๊ทธ๋ฆฌ๋“œ ๋งจ์œ„๋กœ ์ด๋™ํ•ด์„œ ์ถ”๊ฐ€๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณด์ด์ง€ ์•Š๊ณ  ์œ„์ชฝ ๋ฐ์ดํ„ฐ๋งŒ ๋ณด์ด๋Š” ๊ฒƒ์ด๋‹ค.   suppressScrollOnNewData: true ๊ทธ๋ฆฌ๋“œ Props์— ์ด ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๋‹ˆ, ํ•ด๊ฒฐ ๋˜์—ˆ๋‹ค ! https://www.ag-grid.com/javascript-data-grid/grid-options/#reference-scrolling-suppressScrollOnNewData JavaScript Grid: Grid Options ..

Programming/React 2024.10.14

[ React ] vite ์ ˆ๋Œ€ ๊ฒฝ๋กœ ์„ค์ •

import axiosServices from "utils/axios";  page๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ํด๋”์— ํ•œ ํŒŒ์ผ์—์„œ axios๋ฅผ ๋งŒ์ ธ์ค€ axiosServices๋ฅผ ๊ฐ€์ ธ์˜ค๋Š”๋ฐ,๋ถ„๋ช… VS Code์—์„œ๋Š” ์ž˜ ๊ฐ€์ ธ์™€์ง„ ๊ฑธ๋กœ ๋ณด์ธ๋‹ค.      ์˜คํ›„ 1:45:40 [vite] Internal server error: Failed to resolve import "utils/axios" from "src/pages/SM/SM001/pageHooks/usePageFetch.ts". Does the file exist? ๊ทผ๋ฐ ๊ณ„์† ์ด๋Ÿฐ ์—๋Ÿฌ๊ฐ€ ๋œฌ๋‹ค. CRA์—์„œ๋Š” ๋ณธ์  ์—†๋Š” ์˜ค๋ฅ˜๋ผ์„œ ์•ฝ๊ฐ„ ๋‹ต๋‹ตํ–ˆ๋‹ค.  import { defineConfig } from 'vite';import path from 'path';export de..

Programming/React 2024.10.02

[React] CRA๋Œ€์‹  Vite๋กœ React ์„ค์น˜ ๋ฐ ์‹คํ–‰ํ•˜๊ธฐ (TypeScript)

npx create-react-app [ํ”„๋กœ์ ํŠธ ๋ช…] --template typescript ๊ธฐ์กด์—๋Š” react ์„ค์น˜ํ•  ๋•Œ, CRA(Create React App)์„ ์‚ฌ์šฉํ–ˆ์—ˆ๋‹ค.  CRA๋ž€, ๋ฆฌ์•กํŠธ๋กœ ์•ฑ์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ด๋‹ค.  ์œ„์˜ ๋ช…๋ น์–ด๋ฅผ ์น˜๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์™„์„ฑ๋œ๋‹ค.  webpack, babel, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์„ค์ •๊นŒ์ง€ ์ œ๊ณตํ•ด์ฃผ์ง€๋งŒ ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ๋ฐฉ์‹๋Œ€๋กœ ์„ค์ •์„ ๋ฐ”๊พธ๊ธฐ ์–ด๋ ค์šด ๋‹จ์ ์ด ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ”„๋กœ์ ํŠธ ํฌ๊ธฐ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ์†๋„๊ฐ€ ๋” ๋А๋ ค์ง„๋‹ค.  webpack์ด๋ž€, ํ”„๋กœ์ ํŠธ์— ์‚ฌ์šฉ๋œ ํŒŒ์ผ์„ ๋ถ„์„ํ•˜์—ฌ ๊ธฐ์กด ์›น ๋ฌธ์„œ ํŒŒ์ผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋„๊ตฌ์ด๋‹ค. (์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค๋Ÿฌ)ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ .js,.css,.jpg์™€ ๊ฐ™์€ ๊ธฐ์กด ์›น๋ฌธ์„œ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  .sass ๊ฐ™์€ ํŒŒ์ผ๋กœ ์ž‘์„ฑํ•˜๊ธฐ๋„ ํ•˜๋Š”๋ฐ, ์›น๋ธŒ๋ผ์šฐ์ €..

Programming/React 2024.09.27

[ React ] GET ํ˜ธ์ถœํ•˜์ง€๋„ ์•Š์•˜๋Š”๋ฐ ๊ณ„์† GET ํ˜ธ์ถœ๋˜๋Š” ํ˜„์ƒ

const onClickLogin = () => { axios .post(`/api/comm/user/signin`, { id: id, password: pw, }) .then((response) => { console.log(response.data); }) .catch((error) => { console.log(error); }); };๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ–ˆ๋Š”๋ฐ, ๊ณ„์† get์ด ์ฐํžŒ๋‹ค. ๋ฌผ์Œํ‘œ๊ฐ€ ๋ถ™๋Š” ์ด์œ ๋Š”,HTML ํผ์ด GET ๋ฉ”์†Œ๋“œ๋กœ ์ œ์ถœ๋˜๋ฉด, ํผ ํ•„๋“œ ๊ฐ’์ด ์ž๋™์œผ๋กœ ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง์œผ๋กœ ์ถ”๊ฐ€๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. const onClickLogin = (event) => { ev..

Programming/React 2024.08.08

[ React, TypeScript ] Notification ํŒ์—… ์•Œ๋ฆผ ๋„์šฐ๊ธฐ (์ฐฝ์ด ์ตœ์†Œํ™” ๋˜์–ด๋„ ๋œจ๋Š” ์•Œ๋ฆผ)

- ์š”๊ตฌ์‚ฌํ•ญ์ฐฝ์ด ์ตœ์†Œํ™”๋˜์–ด๋„ ๋œจ๋Š” ์•Œ๋ฆผ์ด ์žˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค.  -> ๊ธฐ์กด์— snackbar๋‚˜ useDialog๋กœ ๋„์› ๋˜ ํŒ์—… ์•Œ๋ฆผ์€ ์ฐฝ์ด ์ตœ์†Œํ™”๊ฐ€ ๋˜๋ฉด ๋‹น์—ฐํžˆ ๋ณด์ด์ง€ ์•Š์Œ. -> ๋‹ค๋ฅธ ๋ฉ”์†Œ๋“œ๊ฐ€ ํ•„์š” ๊ทธ๋ž˜์„œ ์ฐพ์•„๋ณด๋‹ค๊ฐ€ Notification API๋ฅผ ์•Œ๊ฒŒ๋˜์—ˆ๋‹ค.  https://mingule.tistory.com/68 React์—์„œ Browser Notification (ํ‘ธ์‹œ ์•Œ๋ฆผ) ๊ตฌํ˜„ํ•˜๊ธฐ๋“ค์–ด๊ฐ€๊ธฐ Babble ํ”„๋กœ์ ํŠธ์—์„œ WebSocket์„ ํ™œ์šฉํ•ด ์ฑ„ํŒ… ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ ๋ฐ” ์žˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, ์œ ์ € ์ž…์žฅ์—์„œ๋Š” ๋‚ด๊ฐ€ ๋“ค์–ด๊ฐ„ ๋ฐฉ์— ์ฑ„ํŒ…์ด ์ƒˆ๋กœ ์˜ฌ๋ผ์˜จ์ง€, ์˜ฌ๋ผ์˜ค์ง€ ์•Š์€์ง€ ํ™•์ธํ•  ๊ธธ์ด ์—†์—ˆ๋‹ค. ๋ฌด์กฐ๊ฑด ๋‹คmingule.tistory.com  https://developer.mozilla.org/ko/docs/Web/API/..

Programming/React 2024.06.13

[React] ag-grid์—์„œ columnDef์˜ useMemo์™€ valueFormatter

0. ์ฒซ ๋ Œ๋”๋ง. ์ฝ”๋“œ๋ถ ์กฐํšŒ. /** ์ฝ”๋“œ ์ดˆ๊ธฐ๊ฐ’ ์กฐํšŒ */ useEffect(() => { getCodeList(); // ์ฝ”๋“œ๋ถ ์กฐํšŒ // eslint-disable-next-line react-hooks/exhaustive-deps }, []); 1. ์ฝ”๋“œ๋ถ์—์„œ ์ƒํƒœ์— ๋Œ€ํ•œ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์™€์„œ setJobStausCd ํ•ด์ค€๋‹ค. const [jobStatusCd, setJobStatusCd] = useState([]); 2. ์ด ํ™”๋ฉด์€ ์ž๋™์กฐํšŒ๊ฐ€ ๋˜์–ด์„œ, ์ฝ”๋“œ๋ถ ์กฐํšŒ ํ›„์—๋Š” ๋ฉ”์ธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. ๊ทธ ๋ฐ์ดํ„ฐ๋Š” dsRowData์— ๋„ฃ์–ด์ค€๋‹ค. const [dsRowData, setDsRowData] = useState([]); 3. ํ•ด๋‹น ๋ฐ์ดํ„ฐ์—์„œ ์ƒํƒœid ์นผ๋Ÿผ์ด ์žˆ๋Š”๋ฐ, id๊ฐ€ ์•„๋‹ˆ๋ผ name์„ ๋ณด์—ฌ์ฃผ..

Programming/React 2024.04.03

[ AG-GRID ] ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ทธ๋ฆฌ๋“œ์— ๋ฐ”๋กœ ๋ฐ˜์˜๋˜๊ฒŒ

applyTransaction์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. const onCellValueChanged = (params: any) => { // ์ƒํƒœ๊ฐ€ '์ถ”๊ฐ€'๊ฐ€ ์•„๋‹ˆ๋ฉด ์ƒํƒœ๋ฅผ '์ˆ˜์ •'์œผ๋กœ ๋ณ€๊ฒฝ if (params.data.rowType !== '์ถ”๊ฐ€' && params.data.rowType !== '์‚ญ์ œ') { params.data.rowType = '์ˆ˜์ •'; const updatedData = [params.data]; params.api.applyTransaction({ update: updatedData }); } };

Programming/React 2024.03.11