์ด๋ฒ ์ฑํฐ์์๋ ๊ฐ์ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ๋ ์๋น์ค์์ ํ์๋ก ํ๋ ๊ธฐ๋ฅ๋ค์ ๋ชจ๋ ๋ฆฌ์คํ ํด๋ณด๊ณ , ๋ช๋ช์ ๊ธฐ๋ฅ์ด ์ด๋ป๊ฒ ๊ตฌํ๋๋์ง ์ ์ด๋ ค์ด ์ง ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
Major ๊ธฐ๋ฅ
- ์๋์ฐ ์คํฌ๋กค์ ๋ฆฌ์คํธ ์คํฌ๋กค์ ์ ์ฉ
- ํ์ด์ง ์ฌ๋ฐฉ๋ฌธ ์ ์คํฌ๋กค ์์น ์ ์ง ๐ฅ
- ์์ดํ ์ ๋์ด๊ฐ ์๋์ผ๋ก ์กฐ์
- ํ๋ฉด์ ๋ณด์ด๋ ์์ดํ ๋ง ๋ ๋๋ง
- ์ด์ ์๋ฅผ ๋ฐ์ํ ์ผ๋ก ์กฐ์
- ์๋ฐฉํฅ ๋ฌดํ ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ๊ณผ ์ฐ๊ฒฐ ๐ฅ
๊ตฌํํ๊ธฐ ๊น๋ค๋ก์ด ๋ถ๋ถ์ด ์๋ ๊ธฐ๋ฅ์ ๐ฅ ๋ก ํ์ํ์ต๋๋ค.
์๋์ฐ ์คํฌ๋กค์ ๋ฆฌ์คํธ ์คํฌ๋กค์ ์ ์ฉ
์๋์ ์์์ ๋ณด๋ฉด ์ํฉ์ ๋ํ ์ดํด๊ฐ ์ฝ์ต๋๋ค.
๋ฆฌ์คํธ ๋ด๋ถ ์คํฌ๋กค์ ๊ฒฝ์ฐ list-container ๋ผ๋ div์ height๊ฐ ์ ํด์ ธ์๊ณ overflow-y๊ฐ scroll์ ๋๋ค. ์ฆ, ํ์ด์ง์ ๊ตฌ์ฑ์ด (ํค๋, ๋ฆฌ์คํธ, ํธํฐ)๋ก ๋์ด์์ ๋ ๋ฆฌ์คํธ์์๋ง ์คํฌ๋กค์ด ๋์ํฉ๋๋ค. (virtuoso ์์)
ํ์ง๋ง ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๊ฐ์ ๋ฆฌ์คํธ๋ฅผ ๊ตฌํํ ๋ ์ ์ฒด ํ์ด์ง ์คํฌ๋กค(์๋์ฐ ์คํฌ๋กค) ์ ์์์ ๊ฐ์ด ๋ง์ฐ์ค๊ฐ ํค๋์ ์๋ ํธํฐ์ ์๋ ์คํฌ๋กค์ด ํ๋์ฒ๋ผ ๋์ ํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๋ฐ๋ผ์ ์๋์ฐ ์คํฌ๋กค ์ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ ๋ฆฌ์คํธ ๋ด๋ถ๊ฐ ์์ง์ผ ์ ์๋๋ก ๊ตฌํํด ์ฃผ์ด์ผ ํฉ๋๋ค.
react-window ๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฒฝ์ฐ ์ด๋ฌํ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด 3rd party ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ react-window-scroller ๋ฅผ ์ฐ๊ฒฐํ์ฌ ์ฌ์ฉํฉ๋๋ค. ์๋์ ์ฝ๋๋ react-window-scroller ์ ์ฝ๋ ์ค ํ์ํ ๋ถ๋ถ๋ง ์ธ์ฉํด์จ ๊ฒ์ ๋๋ค.
useEffect(() => {
const handleWindowScroll = throttle(() => {
const { offsetTop = 0, offsetLeft = 0 } = outerRef.current || {}
const scrollTop = getScrollPosition('y') - offsetTop
const scrollLeft = getScrollPosition('x') - offsetLeft
// ์ด๋ํ๊ณ ์ ํ๋ ์์น๋ก ๋ฆฌ์คํธ ์ปดํฌ๋ํธ scroll ์ด๋
if (isGrid) ref.current && ref.current.scrollTo({ scrollLeft, scrollTop })
if (!isGrid) ref.current && ref.current.scrollTo(scrollTop)
}, throttleTime)
// window ์คํฌ๋กค ๋ฐ์ ์ handleWindowScroll ์คํ
window.addEventListener('scroll', handleWindowScroll)
return () => {
handleWindowScroll.cancel()
window.removeEventListener('scroll', handleWindowScroll)
}
}, [isGrid])
์ด๋ ๊ฒ ์๋์ฐ ์คํฌ๋กค ๋์ ์ ์คํฌ๋กค ์์น๋ฅผ ๋ฐ์์ ๋ฆฌ์คํธ์ ์คํฌ๋กค์ ์กฐ์ ํ๋ ๋ก์ง์ ์ถ๊ฐํด์ฃผ์ด์ผ ํฉ๋๋ค.
์ด ๊ธฐ๋ฅ์ ์ด๋ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์๋ props ํ๋๋ก, ์ด๋ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์๋ 3rd party ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐ๋ํ์ฌ ๊ตฌํํ ์ ์๋๋ฐ, ์ด ๊ธฐ๋ฅ ์์ฒด๊ฐ ๊ตฌํ์ด ์ด๋ ค์ด ๊ฒ์ด ์๋๊ณ ๋ค๋ฅธ ๊ธฐ๋ฅ ๊ณผ์ ์ฐ๋์ด ์ด๋ ต์ต๋๋ค.
ํ์ด์ง ์ฌ๋ฐฉ๋ฌธ ์ ์คํฌ๋กค ์์น ์ ์ง ๐ฅ
์ด ๊ธฐ๋ฅ์ ์๊ฐ๋ณด๋ค ๊ณ ๋ คํ ๊ฒ ๋ง์ต๋๋ค.
๋จผ์ , ์คํฌ๋กค ์์น๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ๊ฐ์ ํ์ด์ง์ธ์ง๋ฅผ ๊ตฌ๋ถํ๋ uniqueId๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค. ์ด “๊ฐ์ ํ์ด์ง”๋ผ๋ ๊ธฐ์ค์ด ์กฐ๊ธ ๋ชจํธํ๋ฐ, ๋ช ๊ฐ์ง ์๋ฅผ ๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
- ๊ฐ์ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ๋ A ํ์ด์ง์์ ์คํฌ๋กค ์ ๋ด๋ฆฐ ํ, B ํ์ด์ง๋ก ์ด๋ํ๋ค. ๊ทธ ํ, ๋ค๋ก๊ฐ๊ธฐ ๋ฒํผ์ ๋๋ฌ์ A ํ์ด์ง๋ก ๋์์๋ค. (๊ฒฐ๊ณผ : A ํ์ด์ง๊ฐ ๋ณด๋ ์คํฌ๋กค ์์น๋ก ๋ณต๊ท๋์ด ์์ด์ผ ํจ)
- ๊ฐ์ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ๋ A ํ์ด์ง์์ ์คํฌ๋กค ์ ๋ด๋ฆฐ ํ, ์๋ก๊ณ ์นจ ํ๋ค. (๊ฒฐ๊ณผ : A ํ์ด์ง๊ฐ ๋ณด๋ ์คํฌ๋กค ์์น๋ก ๋ณต๊ท๋์ด ์์ด์ผ ํจ)
- ๊ฐ์ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ๋ A ํ์ด์ง์์ ์คํฌ๋กค ์ ๋ด๋ฆฐ ํ, B ํ์ด์ง๋ก ์ด๋ํ๋ค. ๊ทธ ํ, ์ฃผ์ ์ฐฝ์ url์ ์ง์ ์ ๋ ฅํ์ฌ A ํ์ด์ง๋ก ๋์์๋ค. (๊ฒฐ๊ณผ : A ํ์ด์ง์ ์คํฌ๋กค์ ์ด๊ธฐํ๋์ด ์์ด์ผ ํจ)
๊ฒฐ๊ตญ ์๋ก๊ณ ์นจ์ด๋ ๋ค๋ก๊ฐ๊ธฐ์ ๊ฐ์ด ์ง๊ธ A ํ์ด์ง๋ฅผ ๋ณด๋ ์ค ๋ค๋ฅธ ๊ณณ์ ๊ฐ๋ค๊ฐ ๋๋์์๋ค๋ ๊ฒ์ด ๋ณด์ฅ๋์ด์ผ ์ ์ฅ๋ ์คํฌ๋กค ์์น๋ฅผ ๋ฐ์์ ์ด๋ํด์ผ ํฉ๋๋ค. ์ด ๊ตฌํ์ history API์ ์ฐ๊ฒฐ๋์ด ์๋๋ฐ, ์๋์ ๊ฐ์ด history API์ pushState ํจ์๋ฅผ ์ด์ฉํด state๋ฅผ ์ง์ด๋ฃ์ผ๋ฉด (1. ์๋ก๊ณ ์นจ / 2. ๋ค๋ก๊ฐ๊ธฐ) ์์๋ state๊ฐ ์ ์ง๋๊ณ (3. url ์ ๋ ฅ ์ ์ ์)์๋ state๊ฐ ๋ ์๊ฐ ๋ฒ๋ฆผ์ ์ ์ ์์ต๋๋ค. ์ด๋ฅผ ์ด์ฉํ์ฌ ์ด์ ์ ์์ฑํ id์ ๊ฐ์ ํ์ด์ง์ธ์ง ํ๋จํ์ฌ uniqueId๋ฅผ ์์ฑํ๋ ํจ์๋ฅผ ๊ฐ๋ฐํ๋ฉด ๋ฉ๋๋ค.
๋๋ฒ์งธ๋ก, ์ด๋ํ๊ณ ์ํ๋ row ์ด์ ์ ์์ดํ ์ด ์๋ค๊ณ ๊ฐ์ ํด์ผ ํฉ๋๋ค. ๋ง์ฝ 50๋ฒ์งธ row๋ก ๋ณต๊ทํ๋ค๋ฉด ์์ 49๊ฐ์ row๊ฐ ์์ ๋์ ๋์ด๊ฐ ๋ฏธ๋ฆฌ ์กํ์์ด์ผ ํฉ๋๋ค. ๋ณดํต ์ด ์์ชฝ๋์ด๋ฅผ ์์๋ก padding์ผ๋ก ์ก์๋๊ณ , ์ค์ ์์ดํ ์ ๋ ๋๋งํ ๋๋ง๋ค ์ฐจ์ด๋ฅผ ๊ฐฑ์ ํด๊ฐ๋ ์์ผ๋ก ๊ตฌํํฉ๋๋ค.
์คํฌ๋กค ์์น ์ค๊ฐ์ผ๋ก ๋์์์ ์ญ๋ฐฉํฅ์ผ๋ก ์คํฌ๋กค์ ์ฌ๋ผ๊ฐ ๋, ์์ ๊ฐ์ด ์ด๋ฏธ ๋์ด๊ฐ ์กํ์์ด padding์ ์ค์ด๊ณ ์์ดํ ์ ๋์ด๋ฅผ ๋์ด๋ ์์ผ๋ก ๊ตฌํํ ์๋ ์์ง๋ง, virtuoso์์์ prepending ์์ ์ ๊ฐ์ด ์๋๋ก ์คํฌ๋กค์ ๋ด๋ฆด ๋์ ๋ง์ฐฌ๊ฐ์ง๋ก ์๋ก ์ฌ๋ฆด ๋๋ ํ row์ฉ ๋ฐ์์ค๋๋ก ํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. prepending์ผ๋ก ๊ตฌํํ ๊ฒฝ์ฐ ์์๊ณผ ๊ฐ์ด ์๋ก๊ณ ์นจ ์ ์คํฌ๋กค ๋ฐ์ ํฌ๊ธฐ๊ฐ ์ปค์ก๋ค๊ฐ ์๋ก ์คํฌ๋กค ํ ์๋ก ์์์ง๋ ๊ฑธ ๋ณผ ์ ์์ต๋๋ค.
์คํฌ๋กค ๋ณต๊ท ๋ก์ง์ด ํ์ํ ์ด์ ๊ฐ ๋ค์ ๋์์์ ๋ ์ด์ ๊ณผ ๊ฐ์ ๊ฒฝํ์ ์ฃผ๊ธฐ ์ํด์๋ผ๋ฉด ์ ์์ padding์ ์ทจํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋ ๊ฒ์ด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก, ์ด๋ํ๊ณ ์ํ๋ row ์ด์ ์ ์์ดํ ๋ฐ์ดํฐ๋ฅผ ์ ๋ถ ๋ฐ์์ค์ง๋ ๋ง์์ผ ํฉ๋๋ค.
๋ฐ๋ก ์ด์ ์ “์ด๋ํ๊ณ ์ํ๋ row ์ด์ ์ ์์ดํ ์ด ์๋ค๊ณ ๊ฐ์ ํด์ผ ํฉ๋๋ค.” ๊ตฌํ๊ณผ ํท๊ฐ๋ฆด ์๋ ์์ ๊ฒ ๊ฐ์๋ฐ์. ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ๊ฒ๊ณผ ์๋ค๊ณ ๊ฐ์ ํ๋ ๊ฒ์ ๋ค๋ฆ ๋๋ค. ์๋ค๊ณ ๊ฐ์ ํ๊ณ padding์ผ๋ก ์์น๋ ์ก์๋์ง๋ง ํ์ฌ ์คํฌ๋กค์ด ๊ทธ๊ณณ์ ์์นํด ์์ง ์์ผ๋ฏ๋ก ์ค์ ์์ดํ ์ ๋ ๋๋ง๋์ด ์์ง์๊ณ , ์ค์ ๋ฐ์ดํฐ๋ ๋ฐ์์ค์ง ์์์ผ ํฉ๋๋ค.
์ด ๋ถ๋ถ์ ๊ฑฑ์ ํ๋ ๊ฒ์ ๋จ์ํ๊ฒ ์์์๋ถํฐ ์์ฐจ์ ์ผ๋ก ์คํฌ๋กค์ ์ด๋ํด์ ํ๊ฒ ์์น์ ๋์ฐฉํ๋๋ก ์คํฌ๋กค ๋ณต๊ท ๋ก์ง์ ๊ตฌํํ ์ ์๋๋ฐ, ์ด๋ ๊ฒ ๋๋ฉด ์คํฌ๋กค์ด ๋ด๋ ค๊ฐ๋ ๋์ ๋ชจ๋ ์์ดํ ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๊ธฐ ๋๋ฌธ์ ๋ง์ ํ๊ฒ ์์น์ ๋์ฐฉํ์ ๋ ๋ฐ์ดํฐ๊ฐ ์์ง ๋ถ๋ฌ์์ง์ง ์์ ์ํ์ผ ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ ์คํฌ๋กค์ด ์ผ์ ์๋ ์ด์์ผ๋ก ์์ง์ด๋ฉด ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค์ง ์๋๋ค๊ฑฐ๋, ํ๊ฒ ์์น์ ์์ดํ ์ด ๋ณด์ด๋๋ก ํ๋ฉด์ ๋์ฐ๊ณ ์์ชฝ์ padding์ ์ฃผ๋ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ ์ ์์ต๋๋ค.
์์ดํ ์ ๋์ด๊ฐ ์๋์ผ๋ก ์กฐ์
์ด ๊ธฐ๋ฅ์ ์๋์ 3๊ฐ์ง ๊ธฐ๋ฅ์ ํฌํจํ๊ณ ์์ต๋๋ค.
- ํ Row์์ row์ ๋์ด๋ row์ ์ํ item ์ค ๊ฐ์ฅ ํฐ ๋์ด์ ๋ง์ถฐ ์กฐ์ ๋๋ค.
- ๊ฐ Row์ ๋์ด๋ ์๋ก ๋ค๋ฅผ ์ ์๋ค.
- item์ ๋์ด๊ฐ ๋์ค ๋ณํ ๊ฒฝ์ฐ ์๋์ชฝ์ row๋ค์ ์๋๋ก ๋ฐ๋ฆฌ๊ฑฐ๋ ์๋ก ์ฌ๋ผ์ค๋ ๋ฑ์ ์์น ๋ณํ๋ฅผ ๊ฒช๊ฒ ๋์ด, ๋ค์ ๋ ๋๋ง ํด์ฃผ์ด์ผ ํ๋ค.
์ง์ ๊ตฌํ ์ ๊ฝค๋ ๋ณต์กํ๊ณ ๋ค๋ฅธ ๊ธฐ๋ฅ๋ค์ ๋ํ ์ํฅ๋๊ฐ ๋๊ธฐ ๋๋ฌธ์ ๋๋๋ก์ด๋ฉด ํด๋น ๊ธฐ๋ฅ์ ์ง์ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
- react-virtuoso (์๋ ์ง์), react-virtualized (CellMeasure๋ฅผ ํตํด ์ง์)
ํ๋ฉด์ ๋ณด์ด๋ ์์ดํ ๋ง ๋ ๋๋ง
ํ์ฌ ํ๋ฉด์ ๋ณด์ด๋ ์์ดํ ๋ง ๋ ๋๋งํ๋ ๊ฒ์ ๊ฐ์ ๋ฆฌ์คํธ์ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ๋๋ค. ๋ค๋ง, ์ด๋ ์ ๋ ํ์ฌ ํ๋ฉด์์ ๋ ๋ณด์ด๊ฒ ํ ์ง(overscan)๋ฅผ ์กฐ์ ํ ์ ์์ด์ผ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ์๊ฐ, ๋ถ๋ฌ์จ ๋ฐ์ดํฐ๋ก ์์ดํ ์ ๋ ๋๋งํ๋ ์๊ฐ๊น์ง ๊ณ ๋ คํ์ฌ ์ฌ์ฉ์์๊ฒ ๋น ๋ฅด๊ฒ ์ฝํ ์ธ ๋ฅผ ๋ ธ์ถ ์ํฌ ์ ์์ต๋๋ค.
์ด์ ์๋ฅผ ๋ฐ์ํ ์ผ๋ก ์กฐ์
๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ List, Grid ๋ ์ด์์์ ๋๋ถ๋ถ ์ ๊ณตํ๋ฏ๋ก ํด๋น ๊ธฐ๋ฅ์ Grid ๋ ์ด์์์ ์ ์ฉํ๋ฉด ๊ตฌํํ๊ธฐ ์ฝ์ต๋๋ค.
์๋ฐฉํฅ ๋ฌดํ ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ๊ณผ ์ฐ๊ฒฐ ๐ฅ
(๋ฌดํ ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ) ๊ธฐ๋ฅ์ ๊ฐ์ ๋ฆฌ์คํธ์ ๋ณ๊ฐ์ธ hooks๋ก ๊ตฌํํด์ผ ํ ๋ถ๋ถ์ด์ง๋ง, ์ ์ ๊ฐ๋จํ๊ฒ ๋ค๋ค๋ณด๊ฒ ์ต๋๋ค. ์ด ๊ธฐ๋ฅ์ hooks๋ก ๊ตฌํ๋๋ฉฐ ๊ฐ๋จํ๊ฒ ๊ฐ์ ๋ฆฌ์คํธ์์ ์ฌ์ฉํ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ ์ญํ ์ ํฉ๋๋ค. ๋ด๋ถ์์ ์๋น์ค ์ฝ๋๋ก๋ถํฐ ์ฃผ์ ๋ฐ์ api fetching ํจ์๋ฅผ ํธ์ถํ๊ฒ ๋์ด์์ต๋๋ค.
๋ฌดํ ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ๋ offset์ ์ด์ฉํ๋ ๋ฐฉ์๊ณผ cursor๋ฅผ ์ด์ฉํ๋ ๋ฐฉ์์ด ์์ต๋๋ค. ์์ธํ ์ค๋ช ์ ํด๋น ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํฉ์๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก offset ๋ฐฉ์์ ์ฌ์ฉํ๋ค๋ฉด hooks ๋ด๋ถ์ ์ ์ฅํ๊ณ ์๋ ๋ฐ์ดํฐ๋ค์ ๋ค์๊ณผ ๊ฐ์ ํ์์ ๊ฐ์ง๋๋ค.
{
data: T[], // ํ์ด์ง ๋ฐ์ดํฐ
state: 'non-load' | 'loaded', // ํ์ด์ง ๋ฐ์ดํฐ๊ฐ ๋ถ๋ฌ์์ง ์ํ
nextPage: boolean, // ๋ค์ ํ์ด์ง ์ ๋ฌด
}>;
state๋ ๋ฐ์ดํฐ๊ฐ ์ค์ ๋ก ๋ถ๋ฌ์ ์ก๋์ง๋ฅผ ์๋ฏธํ๋๋ฐ, non-load ์ํ๋ ๊ฐ๋จํ ๋งํด์ ๋ถ๋ฌ์จ ์ฒ ํ๋(?) ์ํ๋ฅผ ์๋ฏธํฉ๋๋ค. ๋ฐ์ดํฐ๊ฐ ์๋ค๊ณ ๊ฐ์๋ฅผ ๋ํ์ง๋ง ์ค์ ๋ก ๊บผ๋ด๋ณด๋ฉด ๋ฐ์ดํฐ๊ฐ ์๋ ๊ทธ๋ฐ ์ํ์ ๋๋ค. ๋น ๋ฅด๊ฒ ์คํฌ๋กค ํ์ ๋๋, ์คํฌ๋กค ๋ณต๊ท ์ ์์ชฝ row๋ค์ ํด๋นํ๋ page์ ๋ํด์๋ ์ด๋ฌํ ์ํ๋ฅผ ๊ฐ์ง๋๋ค.
๊ฐ์ ๋ฆฌ์คํธ์์ ์ฐ๊ฒฐ์ ๋ค์๊ณผ ๊ฐ์ด ์ด๋ฃจ์ด์ง๋๋ค.
const { totalCount, loadItemList, getItem } = useInfiniteList<Data>({
initialPage: INITIAL_PAGE,
getItemList, // data fetching ํจ์
});
return (
<VirtualizedList
totalCount={totalCount} // ๋ฐ์ดํฐ ์ด ๊ฐ์
loadItemList={loadItemList} // api๋ฅผ ํธ์ถํ๋ ํจ์
renderItem={(index) => { // ๋ ๋๋ง ํจ์
const item = getItem(index); // ์ ์ฅ๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
return (
<div>
{item?.index}
</div>
);
}}
/>
);
Minor ๊ธฐ๋ฅ
- ํ์ด์ง ์ฌ ์ ์ ์ ํ์ด์ง ๋๋น๊ฐ ๋ณ๊ฒฝ ๋์์์ ๊ณ ๋ คํ์ฌ ์คํฌ๋กค ์์น ์ฐพ๊ธฐ
- ํน์ ์์ดํ ์๋ง ์คํ์ผ ์ฃผ๊ธฐ
- ์ค๊ฐ์ ์ง์ ๋ ๋ฆฌ์คํธ ์์ดํ ์ด ์๋ ๋ค๋ฅธ ์์ ์ฃผ์
- ํํฐ๋ ์คํธ ๊ฐ์ด row์ ์์ ์์น๊ฐ ์์ดํ ๋ ์ด์์
- ์คํฌ๋กค ์๋์ ๋ฐ๋ผ placeholder UI ํ์ถ
minor ๊ธฐ๋ฅ๋ค์ ๊ธฐํ์ ๋ฐ๋ผ ํ์ํ ์๋ ์๋ ๊ธฐ๋ฅ ๋ค์ด๋ผ ๋ฐ๋ก ๊ตฌํ ๋ฐฉ๋ฒ์ ์ค๋ช ํ์ง๋ ์๊ฒ ์ต๋๋ค. ์ด์ธ์๋ ๊ฐ์ ๋ฆฌ์คํธ์ ๊ด๋ จํด์๋ ๋ค์ํ ๋์ฆ๊ฐ ์๊ธธ ์ ์์ด ๋ฐฉ๋ ํด์ง ์ ์๋ ์ปดํฌ๋ํธ์ ๋๋ค. ๋ฐ๋ผ์, ์ต๋ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๊ตฌํ ๋ฐ ์ ์ง๋ณด์๊ฐ ํ๋ ๊ธฐ๋ฅ๋ค์ ์์ํ๋ ์์ผ๋ก ๊ตฌํํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ค์ ์ฑํฐ ์์๋ ๊ฐ์๋ฆฌ์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ค์ ์๊ฐํ๊ณ ๊ฐ์ ์ด๋ค ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ํธํ ์ง, ์ด๋ค ์ฅ๋จ์ ์ด ์๋ ์ง ๋น๊ตํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๋ถ์ ํํ ์ ๋ณด๊ฐ ๋ด๊ฒจ์์ ์ ์์ต๋๋ค!
๋๊ธ๋ก ์๋ ค์ฃผ์ธ์ :)
'์น (WEB) > ๊ณต๋ถ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Typescript] ๊ตฌ์กฐ์ ํ์ดํ๊ณผ ๋ ํ์ดํ (1) | 2023.04.16 |
---|---|
[Virtualized List] #3. ๊ฐ์๋ฆฌ์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋น๊ต (2) | 2023.01.28 |
[Virtualized List] #1. ๊ธฐ๋ณธ (Virtualized List์ ๊ตฌ์ฑ) (2) | 2022.12.02 |
์ธ์ฆ ์ด ์ ๋ฆฌ :: 3. SSO ์ธ์ฆ ๋ฐ ์ด ์ ๋ฆฌ (2) | 2022.03.15 |
์ธ์ฆ ์ด ์ ๋ฆฌ :: 2. ๋ค์ํ ์ํฉ์์์ ๋ค์ํ ์ธ์ฆ (feat. SAML, OAuth 2.0) (0) | 2022.03.15 |
Comment