React Infinite Scroll

์ตœ์ •ํ™˜ยท2021๋…„ 11์›” 6์ผ
0

React

๋ชฉ๋ก ๋ณด๊ธฐ
6/7
post-thumbnail

๐Ÿ”” 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)
}

0๊ฐœ์˜ ๋Œ“๊ธ€