dukDukz

React Next | 인피니티 스크롤 (Infinite Scroll) 본문

웹 개발/React

React Next | 인피니티 스크롤 (Infinite Scroll)

헤일리_HJ 2021. 8. 27. 16:48

[post.jsx]

 

import wrapper from '../Providers/createCtx'
import { GET_POST } from '../reducers/post'
import { END } from 'redux-saga'
import { useDispatch, useSelector } from 'react-redux'
import { useEffect } from 'react'
import Link from 'next/link'

const posts = () =>{
    const dispatch = useDispatch()
    const {posts} = useSelector(state => state.post)
 
    const postLink = posts.map((v,k)=>{
        return(
            <li key = {k}>
                 {/* <h2><Link href="/posts/[id]" as={`/posts/${v.id}`}><a>{v.title}</a></Link></h2> */}
                 <h2><Link href={`/posts/${v.id}`}><a>{v.title}</a></Link></h2>
                <span>{v.body}</span>
            </li>
        )
    })
    useEffect(()=>{
        function scrollFn(){
            if ((parseInt(window.scrollY + document.documentElement.clientHeight)) === document.documentElement.scrollHeight){
                console.log('hello!');
                dispatch(GET_POST())
            }
        }
        window.addEventListener('scroll',scrollFn)           // 스크롤 내릴때마다 저 함수이벤트 발생하게
        return () =>{
            window.removeEventListener('scroll',scrollFn)   // 종료시점도 지정해주기
        }
    },[])

    return (
        <>
            <h1>Posts ({posts.length})</h1>
            <ul>
                {postLink}
            </ul>
        </>
    )
}



export default posts

 

 

import { useEffect } from 'react'

 

1. window.scrollY

: 현 시점 스크롤의 높이

 

2. document.documentElement.clientHeight

: 내 브라우저(눈에 보이는)의 높이

 

3. document.documentElement.scrollHeight

: 토탈 높이

1+2 = 3 이 됨

 

scrollHeight = scrollY + clientHeight  같아지면 scroll이 끝까지 내려갔다는 것이다.

 

useEffect 안에 스크롤 끝까지 도착했을 때 dispatch를 보내서 또 data를 받아오는것. - 그래서 무한으로 된당

 

 

근데 내 브라우저가 이상한지 값을 더하면 살짝 넘치거나 모자라는 경우가 있어서 parseInt 로 해줬다. 

처음 몇번은 잘 되다가 한 5번 넘어가면 값이 모자라면서 같아지지 않아서 거기서 멈추게 된다 ㅜㅜ 아무튼 요거는 라이브러리 있다고 하니까 다시 한번 봐야할 듯 싶다

 

'웹 개발 > React' 카테고리의 다른 글

React 에서 사용하기 좋은 아이콘  (0) 2021.12.11
React Next | 동적 라우팅 | SSR server side rendering  (0) 2021.08.27
React Next 기본 틀  (0) 2021.08.27
0806 Redux-saga  (0) 2021.08.06
0730 제너레이터  (0) 2021.08.05