Programming/React

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

seulye 2024. 4. 3. 12:48

 

0. ์ฒซ ๋ Œ๋”๋ง. ์ฝ”๋“œ๋ถ ์กฐํšŒ.

/** ์ฝ”๋“œ ์ดˆ๊ธฐ๊ฐ’ ์กฐํšŒ */
    useEffect(() => {
        getCodeList(); // ์ฝ”๋“œ๋ถ ์กฐํšŒ
        // eslint-disable-next-line react-hooks/exhaustive-deps
    }, []);

 

 

1. ์ฝ”๋“œ๋ถ์—์„œ ์ƒํƒœ์— ๋Œ€ํ•œ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์™€์„œ setJobStausCd ํ•ด์ค€๋‹ค.

const [jobStatusCd, setJobStatusCd] = useState<Array<any>>([]);

 

 

2. ์ด ํ™”๋ฉด์€ ์ž๋™์กฐํšŒ๊ฐ€ ๋˜์–ด์„œ, ์ฝ”๋“œ๋ถ ์กฐํšŒ ํ›„์—๋Š” ๋ฉ”์ธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. 

๊ทธ ๋ฐ์ดํ„ฐ๋Š” dsRowData์— ๋„ฃ์–ด์ค€๋‹ค.

const [dsRowData, setDsRowData] = useState<Array<any>>([]);

 

 

3. ํ•ด๋‹น ๋ฐ์ดํ„ฐ์—์„œ ์ƒํƒœid ์นผ๋Ÿผ์ด ์žˆ๋Š”๋ฐ, id๊ฐ€ ์•„๋‹ˆ๋ผ name์„ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ์–ด์„œ,

1๋ฒˆ์—์„œ setํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด์ค€๋‹ค. (valueFormatter ์‚ฌ์šฉ)

const valueFormatter = (params: any) => {
        return `${jobStatusCd?.find((element: any) => element.cdId === params.data.value)?.cdNm ?? ''} `;
    };

 

 

4. jobStatusCd๋ฅผ ๋ถ„๋ช… ์ž˜ setํ•ด์คฌ์Œ์—๋„, valueFormatter ๋‚ด๋ถ€์—์„œ ๋กœ๊ทธ๋ฅผ ์ฐ์–ด๋ณด๋ฉด ๋นˆ๊ฐ’์œผ๋กœ ๋‚˜์˜จ๋‹ค.

 

 

5. ์ปฌ๋Ÿผ ์ •์˜ ๋ถ€๋ถ„์ด useMemo๋กœ ๋˜์–ด์žˆ์—ˆ๋‹ค. 

const columnDef = useMemo(
        () => [
            { headerName: '์ƒํƒœ', field: 'state' },
            ... ์ƒ๋žต
        ],
        []
    );

 

https://ag-grid.com/react-data-grid/react-hooks/

If you do NOT use useState or useMemo, then the grid will be provided with a new set of Column Definitions every time the component is rendered.

 

ag-grid ๊ณต์‹๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด useState๋‚˜ useMemo๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜๊ณ  ์žˆ๋‹ค. 

 

 

6. valueFormatter๋ฅผ dependency Array๋กœ ๋„ฃ์–ด์ฃผ๊ธฐ

const columnDef = useMemo(
        () => [
            { headerName: '์ƒํƒœ', field: 'state', valueFormatter },
            ... ์ƒ๋žต
        ],
        [valueFormatter]
    );

 

์ด๋ ‡๊ฒŒ ๋„ฃ์–ด์ฃผ๋‹ˆ, ๊ฐ’์ด ์ž˜ ๋‚˜์˜จ๋‹ค!