Intro
์๋ ํ์ธ์. ์ด๋ฒ ์๊ฐ์๋ react-virtuoso ์์ ๋์ ๋์ด๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค. ์ฐธ๊ณ ๋ก ์ ๋ third-party mui tabler๊ณผ ๊ฒฐํฉํ์ฌ ์ฌ์ฉํ์์ต๋๋ค.
My case
react-virtuoso mui table ์ฌ์ฉ๋ฒ์ ์๋์ ๊ฐ์ต๋๋ค. height ๋ฅผ ์ค์ ํด์ค ๋ ๋ค์๊ณผ ๊ฐ์ด ๊ณ ์ ๊ฐ์ด ๋ค์ด๊ฐ๊ฒ ๋ฉ๋๋ค.
export default function ReactVirtualizedTable() {
return (
<Paper style={{ height: 400, width: '100%' }}>
<TableVirtuoso
data={rows}
components={VirtuosoTableComponents}
fixedHeaderContent={fixedHeaderContent}
itemContent={rowContent}
/>
</Paper>
);
}
์ ์ผ์ด์ค์ ๊ฒฝ์ฐ ์ฌ๋ฌ rows ๋ฐ์ดํฐ๊ฐ ์๊ณ , ๊ทธ ๋ฐ์ดํฐ๋ค์ ๊ฐ๊ฐ ๋์ด๊ฐ ๋ฌ๋ผ์ height๋ฅผ ๋์ ์ผ๋ก ์ค์ ํด์ค์ผ ํ์ต๋๋ค. ์ด๋ค ๋ฐฉ๋ฒ์ ์ฌ์ฉํด์ผ ํ ๊น์?
How to solve the problem
import React, { useMemo } from 'react';
const DynamicHeightVirtualizedTable = ({ headers, rows, stickyHeader, realTime }) => {
const ref = useRef(null);
// ๊ฐ row ์ ๋์ด ์ค์
const rowHeight = 65;
const dynamicHeight = useMemo(() => {
if (!rows || rows.length === 0) return 222; // rows๊ฐ ์์ ๋ ์ต์ํ์ row ๋์ด ์ค์
const calculatedHeight = 120 + (rows.length * rowHeight); // 120์ ๊ฒฝ์ฐ header ๋์ด์ฌ์ ๋ํด์ค, ๊ฐ๊ฐ ๋ค๋ฅด๊ฒ ์ค์ ํด์ฃผ๋ฉด ๋จ
// ์ ๋ min height๋ฅผ ์ง์ ํด์ฃผ๊ณ ์ถ์ด์ ๋ค์์ ๋ก์ง์ ํ์ฉํจ
return Math.min(calculatedHeight, 850);
}, [rows]);
{/* ...code omitted for brevity... */}
return (
<Paper
style={{
height: dynamicHeight,
width: '100%',
backgroundColor: 'transparent',
overflowX: 'auto',
}}
ref={ref}
>
<TableVirtuoso
data={rows}
components={VirtuosoTableComponents}
fixedHeaderContent={fixedHeaderContent}
itemContent={rowContent}
/>
</Paper>
);
};
๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๋จผ์ ๋์ ๋์ด๋ก ์ฌ์ฉํ ๋ณ์(dynamicHeight)๋ฅผ ์ ์ธํด์ค๋๋ค. useRef๋ฅผ ํ์ฉํด์ ๋์ด๋ฅผ ๊ณ์ฐํ ์ปดํฌ๋ํธ์ ref ๋ฅผ ์ถ๊ฐํด์ค๋๋ค.
์ฌ์ฉํ๊ณ ๊ณ์๋ ์คํ์ผ์ ๋ฐ๋ผ row์ ๋์ด๊ฐ ๋ค๋ฅผํ ๋ฐ์, ์ ๋ 65px์ด์ฌ์ ๊ธฐ๋ณธ ๋์ด๋ฅผ 65๋ก ์ค์ ํ๊ณ , ํน์ rows ๋ฐ์ดํฐ๊ฐ ์๊ฑฐ๋, length๊ฐ 0์ผ ๋๋ฅผ ๋ฐ๋นํ์ฌ ์ต์ ๋์ด๋ ๋ฐ๋ก ์ค์ ํด์ฃผ์์ต๋๋ค. ์ดํ rows.length ๋งํผ rowHeight๋ฅผ ๊ณฑํด์ค๋๋ค. ์ ๋ header์ ๋์ด๊น์ง ๊ณ ๋ คํ์ฌ 120px๋ฅผ ๋ํด์ฃผ์์ต๋๋ค. ๊ทธ๋ผ ๋์ ๋์ด๊ฐ rows๋ง๋ค ์ ๋์ํ๋๋ฐ์, ์ ๋ ์๋ฌด๋ฆฌ ๋ฐ์ดํฐ๊ฐ ๋ง์๋ ๋๋ฌด ๊ธธ์ด๋ณด์ด๋ ๊ฑด ์ํ์ง ์์์, ์ต์ํ์ ๋์ด๋ก 850px์ ์ค์ ํด์ฃผ์์ต๋๋ค.
ํด๋น ๋ฐฉ๋ฒ ํ์ฉ ์ react-virtuoso ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋์ ๋์ด๋ก๋ ์ค์ ์ด ๊ฐ๋ฅํฉ๋๋ค.
https://virtuoso.dev/mui-table-virtual-scroll/