250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 항해99 사전스터디
- this
- 리액트
- FP 특징
- 렌더링 최적화
- 웹팩 기본개념
- 실행컨텍스트
- 자바스크립트 엔진 v8
- 리덕스
- 테스트 코드 툴 비교
- toggle-btn
- JS module system
- Js module
- js배열 알고리즘
- 항해99 미니프로젝트
- gql restapi 차이
- chromatic error
- 함수형 프로그래밍 특징
- v8 원리
- 알고리즘
- 리액트 메모이제이션
- 항해99 부트캠프
- 웹 크롤링
- jwt
- 리액트 메모
- 타입스크립트
- next js
- 리액트 렌더링 최적화
- 코어자바스크립트
- 항해99
Archives
- Today
- Total
Jaeilit
TIL 무한스크롤 구현 aixos 편 본문
728x90
import React, { useCallback, useEffect, useState } from "react"
import _ from "lodash"
export const InfinityScroll = (props) => {
const { children, callNext, is_next, loading } = props
const _handleScroll = _.throttle(() => {
const { innerHeight } = window
const { scrollHeight } = document.body
// 스크롤 계산!
const scrollTop =
(document.documentElement && document.documentElement.scrollTop) ||
document.body.scrollTop
if (scrollHeight - innerHeight - scrollTop < 200) {
if (loading) {
return
}
callNext()
}
}, 300)
const handleScroll = useCallback(_handleScroll, [loading])
useEffect(() => {
if (is_next) {
window.addEventListener("scroll", handleScroll)
} else {
window.removeEventListener("scroll", handleScroll)
}
return () => window.removeEventListener("scroll", handleScroll)
}, [is_next, loading])
return <>{children}</>
}
InfinityScroll.defaultProps = {
children: null,
callNext: () => {},
is_next: false,
loading: false,
}
로데쉬의 쓰로틀을 걸어서 3초마다 스크롤을 추적하게 만듬
스크롤 위치가 바닥에서 200남기면 callNext 로 다음꺼를 불러오는 로직
useCallback 으로 스크롤 계산값을 메모이제이션 해놓고
useEffect 로 scroll 이벤트르 일으킴,
const [view, setView] = useState({
start: 0,
next: 2,
})
useEffect(() => {
dispatch(postActions.getPostMD(view))
}, [comment_list, view])
// console.log(is_loading, "isloading")
return (
<InfinityScroll
callNext={() => {
setView({
// ...view,
start: view.start,
next: (view.next += 2),
})
}}
is_next={true}
loading={is_loading}
>
리덕스 부분에서 getPost로 res.data 를 slice 해서 가져오기 때문에
slice 할 값을 state 로 컨트롤 하여 넘겨줌
처음 start 0
그 다음값 next = 2
스크롤이 바닥을 치면 실행되는 callNext 함수 안에 setView 로 start 는 기본 0 이고
next 는 현재 view 값의 +=2 누적값을 더해줌
오류나는 부분은 is_next 가 제 역할을 못하고있기 때문에 true 값을 고정으로 주었고
그로인해 지금 바닥을 치면 가져올게 없는데도 자꾸 +=2를 하게 됨,
내일 수정해야합니다.
728x90
'TIL' 카테고리의 다른 글
리액트 axios 로그인구현(Cookie 편) (0) | 2021.10.27 |
---|---|
axios 리액트 카카오 로그인 구현 (0) | 2021.10.26 |
axios 날짜 소팅하기 (0) | 2021.10.20 |
오늘 알아볼 키워드 웹소켓 vs REST (양방향 통신, 단방향 통신) (0) | 2021.10.16 |
TIL axios.delete (0) | 2021.10.13 |