๐ Infinite Scroll์ด๋
ํ์ด์ง์ ๋์ด ์์ด ์ ๋ณด๊ฐ ์์ผ๋ฉด ๋๋ ๋๊น์ง ์ ํ ์์ด ํ์ด์ง๋ฅผ ๊ณ์ ๋ค์ดํ ์ ์๋ ๊ธฐ๋ฅ์ด๋ผ๊ณ ์๊ฐํ๋ค.
API์์ ์ ๋ณด๋ฅผ ๋ฐ์์ฌ๋ 10๊ฐ๋ฉด10๊ฐ 20๊ฐ๋ฉด 20๊ฐ ์ ํ์ ๋๊ณ 10๊ฐ์ฉ ๋ํ๋ด๊ณ ๋์ ๋ด๋ฆฌ๊ณ ๊ธฐ๋ค๋ฆฌ๋ฉด ๋ค์ 10๊ฐ ...์์ผ๋ก ๊ฐ๋ค.
๐ scrollHeight scrollTop clientHeight
๐ง
scrollHeight ๊ฐ์ ์์ง ์คํฌ๋กค๋ฐ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์์์ ์ฝํ
์ธ ๋ฅผ ๋ชจ๋ ๋ํ๋ผ ๋ ํ์ํ ์ต์ ๋์ด์ ๊ฐ๊ณผ ๋์ผ
์ฝ๊ธฐ ์ ์ฉ ์์ฑ์ ์์ ์ฝํ
์ธ ์ ์ด ๋์ด๋ฅผ ๋ํ๋ด๋ฉฐ, ๋ฐ๊นฅ์ผ๋ก ๋์ณ์ ๋ณด์ด์ง ์๋ ์ฝํ
์ธ ๋ ํฌํจ
element.scrollHeight - element.scrollTop === element.clientHeight
์ด๋ผ๋ฉด ์คํฌ๋กค์ ๋๊น์ง ๋ด๋ ค์ง ๊ฒ
scrollTop๊ฐ์ ์์์ ์๋จ์์ ๊ฐ์ฅ ์๋จ์ ๋ณด์ด๋ ์ฝํ ์ธ ๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ์ธก์ ํ ๊ฒ
์ฝ๊ธฐ ์ ์ฉ ์์ฑ์ธ Element.clientHeight์ ์๋ฆฌ๋จผํธ์ ๋ด๋ถ ๋์ด๋ฅผ ํฝ์ ๋ก ๋ฐํ
๐ React์์ ๋ฌดํ ์คํฌ๋กค
๐ง if (scrollTop + clientHeight >= scrollHeight)
์คํฌ๋กค์ ๋ด๋ฆฐ ๊ฐ๊ณผ ๋ด๊ฐ ์ง๊ธ ๋ณด๊ณ ์๋ ์ฐฝ์ ๋์ด๋ฅผ ๋ํ๊ณ ๋ง์ฝ ์ด๊ฒ ์คํฌ๋กค์ ์ ์ฒด ๋์ด์ ๊ฐ์์ง๊ฑฐ๋ ์ปค์ง๋ค๋ฉด... ํ์ด์ง๋ฅผ + 1ํ๊ณ api๋ฅผ page๋ก ๋ฐ์์ค๋ ํจ์์ ๊ทธ page๊ฐ ๋ค์ ๋ค์ด๊ฐ์ ๋ค์ api๋ก ์ ๋ณด๋ฅผ ๋ฐ์์จ๋ค.
// ๋ช ํ์ด์ง์ธ์ง ์๊ธฐ ์ํจ ํ๋ฒ ์คํฌ๋กค์ ๋ด๋ฆฌ๋ฉด +1 ํด์ ๋ช๋ฒ ๋ด๋ ธ๋์ง ์๋ ค์ค
const [page, setPage] = useState(1);
const handleScroll = () => {
const scrollHeight = document.documentElement.scrollHeight;
const scrollTop = document.documentElement.scrollTop;
const clientHeight = document.documentElement.clientHeight;
if (scrollTop + clientHeight >= scrollHeight) {
setPage(page + 1);
}
}
useEffect(() => {
// scroll event listener ๋ฑ๋ก
window.addEventListener('scroll', handleScroll);
return () =>
// ๋๋๋ฉด scroll event listener ์ ๊ฑฐํด์ ๊ณ~์ ๋ ๋ชป ๋ด๋ฆฌ๊ฒ
{window.removeEventListener('scroll', handleScroll)
}