๐ง ์ฝ๋๊ฐ ๋๋ฌด ๋น ๋ฅผ ๋๋ง ๋ํ๋๋ React ๋ฒ๊ทธ
Source: Dev.to
๐งฉ ๋ฌธ์ : โ์ ๊ฐ ํ์ด ์๋ก ๋ค๋ฅธ ์ํ๋ฅผ ๋ณด๋๊ฐ?โ
PrimeReactโฏDataTable์ ๊ฐ ํ๋ง๋ค ๋ฒํผ์ด ์์์ต๋๋ค. ๋ฒํผ์ ํด๋ฆญํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ถ๋ ฅ์ด ๋ํ๋ฌ์ต๋๋ค:
Button 0 clicked โ items.length = 1
ํด๋ฆญ ์์ ์ ์ ์ญ ์ํ์๋ ๋ช ํํ 3๊ฐ์ ์์ดํ ์ด ์์์์๋, ๊ฐ ๋ฒํผ์ ๋ง์น ์ด์ ๋ฒ์ ์ ์ํ๋ฅผ ๊ธฐ์ตํ๊ณ ์๋ ๊ฒ์ฒ๋ผ ๋์ํ์ต๋๋ค.
๐ฌ ์ด์ ์ฌํ ๋ฐฉ๋ฒ
- ํ ์ด๋ธ์ ํ 3๊ฐ๋ฅผ ์ถ๊ฐํ๋ค.
- ํโฏ1์ ๋ฒํผ์ ํด๋ฆญ โ ๋ก๊ทธโฏ1.
- ํโฏ2์ ๋ฒํผ์ ํด๋ฆญ โ ๋ก๊ทธโฏ2.
- ํโฏ3์ ๋ฒํผ์ ํด๋ฆญ โ ๋ก๊ทธโฏ3.
๊ฐ ํ์ด ๊ณผ๊ฑฐ์ โ๊ณ ์ โ๋ ๊ฒ์ฒ๋ผ ๋ณด์์ต๋๋ค.
๐ค ์ ์ด๋ ๊ฒ ํผ๋์ค๋ฌ์ ๋๊ฐ
- UI๋ ์ ์์ ์ผ๋ก ๋ณด์๋ค.
- ์ํ ์ ๋ฐ์ดํธ๋ ์ ์์ ์ผ๋ก ์๋ํ๋ค.
- ์ค๋ฅ๋ ๊ฒฝ๊ณ ๊ฐ ๋ํ๋์ง ์์๋ค.
- ๋ฉ๋ชจ์ด์ ์ด์
์ ๋๋ฉด(
cellMemo={false}) โํด๊ฒฐโ๋๋ ๋ฏํ์ผ๋ฉฐ, ์ด๊ฒ์ด ๋จ์๊ฐ ๋์๋ค.
๐ง ์จ๊ฒจ์ง ์์ธ: ๋ฉ๋ชจ์ด์ ์ด์ + ํด๋ก์
PrimeReact์ DataTable์ ์ฑ๋ฅ ํฅ์์ ์ํด ์
๋ฉ๋ชจ์ด์ ์ด์
(cellMemo=true๊ฐ ๊ธฐ๋ณธ) ์ ์ง์ํฉ๋๋ค. ์ฆ, ํน์ ๋ฉ๋ชจ ํค๊ฐ ๋ณํ ๋๋ง ์
์ ๋ค์ ๋ ๋๋งํฉ๋๋ค.
์ด๋์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋์?
- ๊ธฐ์กด ํ๋ค์ ๊ฐ์ ๊ฐ์ฒด ๋ ํผ๋ฐ์ค๋ฅผ ์ ์งํ๋ค.
- ๋ฉ๋ชจ์ด์ ์ด์ ๋ ์ ์ ๋ค์ ๋ ๋๋ง๋์ง ์์๋ค.
- ์ด๋ฒคํธ ํธ๋ค๋ฌ(
onClick)๋ ์์ฑ๋ ๋ ๋ ์์ ์ ํด๋ก์ ๋ฅผ ๊ทธ๋๋ก ์ ์งํ๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ๊ฐ ๋ฒํผ์ ์์ฑ ์์ ์ ์ํ ์ค๋ ์ท์ ์บก์ฒํ์ผ๋ฉฐโ๋ฉ๋ชจ์ด์ ์ด์ ๋๋ฌธ์ ๋ฐ์ํ ๊ณ ์ ์ ์ธ staleโclosure ๋ฌธ์ ์์ต๋๋ค. ์ํ ๋ก์ง ์์ฒด๊ฐ ์์ธ์ด ์๋์์ต๋๋ค.
๐งช ์ต์ ์ฌํ ์์ (Pure React)
import React from "react";
const Row = React.memo(
({ item, index, snapshotLength }) => {
const onClick = () => {
console.log(index, snapshotLength);
};
return Click;
},
(prev, next) => prev.item === next.item // โ snapshotLength ๋ฌด์
);
snapshotLength๊ฐ ๋ฉ๋ชจ ๋น๊ต์ ํฌํจ๋์ง ์์ ํ์ด ๋ค์ ๋ ๋๋ง๋์ง ์๊ณ , ํด๋ฆญ ํธ๋ค๋ฌ๋ ์ค๋๋ ๋ฐ์ดํฐ๋ฅผ ์ ์งํฉ๋๋คโDataTable ๋ฒ๊ทธ์ ๋์ผํ ์ํฉ์
๋๋ค.
๐ ๏ธ ์ค์ ํด๊ฒฐ ๋ฐฉ๋ฒ (ํดํน์ด ์๋)
๋น ๋ฅธ ์ฐํ ๋ฐฉ๋ฒ
๋ฉ๋ชจ์ด์ ์ด์ ์ ๋๋ฉด ํฐ ํ ์ด๋ธ์์ ์ฑ๋ฅ ์ด์ ์ ์๊ฒ ๋ฉ๋๋ค.
์ฌ๋ฐ๋ฅธ ํด๊ฒฐ์ฑ
PrimeReact์์๋ ํ ๊ตฌ์กฐ๊ฐ ๋ฐ๋ ๋๋ง๋ค ๋ฉ๋ชจ์ด์ ์ด์ ํค๊ฐ ๋ณํ๋๋ก ์กฐ์ ํฉ๋๋ค.
์์ ์
cellMemoProps = { index };
์์ ํ
cellMemoProps = { rowIndex };
rowIndex๋ ํ์ด ์ถ๊ฐ, ์ญ์ , ์ฌ์ ๋ ฌ๋ ๋๋ง๋ค ๋ณํ๋ฏ๋ก, ํ์ํ ๊ฒฝ์ฐ ๋ฉ๋ชจ์ด์ ์ด์
๋ ์
์ ๋ค์ ๋ ๋๋งํ๊ฒ ๋ฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฑ๋ฅ์ ํฌ์ํ์ง ์๊ณ ๋ ์ต์ ํด๋ก์ ๋ฅผ ํ๋ณดํ ์ ์์ต๋๋ค.
โ ๊ฒฐ๊ณผ
์์ ์ ์ ์ฉํ ๋ค:
- Buttonโฏ0 โ
items.length = 3 - Buttonโฏ1 โ
items.length = 3 - Buttonโฏ2 โ
items.length = 3
staleโฏclosure๊ฐ ์ฌ๋ผ์ง๊ณ , ์ฑ๋ฅ ์ ํ๋ ์์ผ๋ฉฐ, API ๋ณ๊ฒฝ๋ ํ์ํ์ง ์์์ต๋๋ค.
๐คฏ ๋ถ๊ฐ ์ธ์ฌ์ดํธ: useFieldArray๊ฐ โ๊ทธ๋ฅ ์๋ํโ ์ด์
React Hook Form์ useFieldArray๋ฅผ ์ฌ์ฉํ ๋๋ ๋ฒ๊ทธ๊ฐ ๋ํ๋์ง ์์์ต๋๋ค. useFieldArray๋ ์
๋ฐ์ดํธ ์๋ง๋ค ์๋ก์ด ๊ฐ์ฒด ๋ ํผ๋ฐ์ค๋ฅผ ์์ฑํ๋ฏ๋ก ๋ฉ๋ชจ์ด์ ์ด์
์ด ์์ฐ์ค๋ฝ๊ฒ ๋ฌดํจํ๋ฉ๋๋ค. ํ์ด ์๋์ผ๋ก ๋ค์ ๋ ๋๋ง๋์ฃ โ๋ง๋ฒ์ด ์๋๋ผ ๊ฐ์ฒด ์ ์ฒด์ฑ์ด ์ฐ๋ฆฌ ํธ์ผ๋ก ์์ฉํ ๊ฒฐ๊ณผ์์ต๋๋ค.
๐ง ํต์ฌ ์ ๋ฆฌ
- ๋ฉ๋ชจ์ด์ ์ด์ ๋ฒ๊ทธ๋ ์ ์ฒด์ฑ(identity) ๋ฒ๊ทธ์ด๋ฉฐ, ์ํ ๋ฒ๊ทธ๊ฐ ์๋๋ค.
- ๋์์ ์ํฅ์ ์ฃผ๋ ๋ชจ๋ prop์ ๋ฉ๋ชจ ๋ฌดํจํ ํค์ ํฌํจ์์ผ์ผ ํ๋ค.
- ์ํ๊ฐ ์ฌ๋ฐ๋ฅด๋๋ผ๋ staleโฏclosure๊ฐ ์กด์ฌํ ์ ์๋ค.
- ๋ฉ๋ชจ์ด์ ์ด์ ์ ๋๋ ๊ฒ์ ์์ ๋ฐฉํธ์ผ ๋ฟ, ๊ทผ๋ณธ์ ์ธ ํด๊ฒฐ์ฑ ์ด ์๋๋ค.
- ์ฑ๋ฅ ์ต์ ํ์๋ ์ถ๊ฐ์ ์ธ ์ ํ์ฑ ๊ด๋ฆฌ๊ฐ ํ์ํ๋ค.
๐ ๋ง๋ฌด๋ฆฌ ์๊ฐ
์ด ๋ฒ๊ทธ๋:
- ๋ถ๊ฐ๋ฅํด ๋ณด์๋ค.
- ๋ก๊ทธ๋ฅผ ๋จ๊ฒจ๋ ์ฌ๋ผ์ก๋ค.
- โ๋จ์ํโํ๋ฉด ์ฌ๋ผ์ก๋ค.
๋ ๋ ์ค๋ ์ท ๊ด์ ์์ ์๊ฐํ๋ฉด ๋ฌธ์ ๋ฅผ ๋ฐ๋ก ํ์ ํ ์ ์์ต๋๋ค. ๋น ๋ฅธ ํผ๋๋ฐฑ๊ณผ ํ์ ์ ์ ๊ณตํด ์ฃผ์ PrimeReact ์ ์ง๋ณด์ํ๊ณผ ํ๋ฅญํ ์ฌํ ์์๋ฅผ ๋ง๋ค์ด ์ฃผ์ ์ ๋ณด๊ณ ์์๊ฒ ํฐ ๊ฐ์ฌ๋ฅผ ์ ํฉ๋๋ค.