react-infinite-scroll-component
라이브러리 사용법입니다.
화면구현
react-infinite-scroll-component 기본 예제
import React from 'react';
import InfiniteScroll from 'react-infinite-scroll-component';
const Component = () => {
const [items, setItems] = useState(Array.from({ length: 40 }))
const fetchData = () => {
setTimeout(() => {
setItems(items.concat(Array.from({ length: 50 })))
}, 1500);
};
return (
<>
<InfiniteScroll
dataLength={items.length} //반복되는 컴포넌트의 개수
next={fetchData} //스크롤이 화면 맨 아래에 닿았을때 부르는 함수
hasMore={true} ///추가 데이터가 있는지 여부
loader={<h4>Loading...</h4>} //로딩바
>
{items.map((i, index) => (
<div key={index}>
div - #{index}
</div>
))}
</InfiniteScroll>
</>
);
};
export default Component;
화면 구현(페이지 무한 스크롤)
포스팅 무한 스크롤 적용 예제
import React, { useState, useEffect } from 'react';
import InfiniteScroll from 'react-infinite-scroll-component';
import { useDispatch, useSelector } from "react-redux";
import { fetchAllPosts } from '../../../../features/mobile/cafe/cafeSlice';
const Component = () => {
const dispatch = useDispatch()
const { loginInfo } = useSelector((state) => state.commonApp)
const [viewPosts, setViewPosts] = useState([]) //리스트 내 포스트
const [morePosts, setMorePosts] = useState(true) //추가 포스트가 있는지 여부
const onFetchMorePosts = () => { //추가 포스트 불러오기
let params = { lastPostingId: viewPosts[viewPosts.length - 1]?.id, userId: loginInfo.userId }
if (morePosts) { //추가 포스트가 true일 경우만 함수 실행
dispatch(fetchAllPosts(params)) //redux-toolkit 사용
.unwrap()
.then(res => {
if (res.ok) {
setMorePosts(res.isExistNextPosting)//추가 포스트 여부
setViewPosts(viewPosts.concat(res.postingList)) //추가 포스트 더하기
}
})
.catch(err => console.log(err))
}
}
useEffect(() => {
let params = { userId: loginInfo.userId }
dispatch(fetchAllPosts(params)) //초기에 한번 불러오기
.unwrap()
.then(res => {
if (res.ok) {
setMorePosts(res.isExistNextPosting)
setViewPosts([...viewPosts, ...res.postingList])
}
})
return () => setValue('')
// eslint-disable-next-line
}, [dispatch, loginInfo.userId])
return (
<>
<InfiniteScroll
dataLength={viewPosts.length}
next={onFetchMorePosts} /
hasMore={morePosts}
loader={
<div className='text-center mt-4'>
<h6 className='text-caption_1 text-gray_40'>loading...</h6>
</div>
}
>
<BoardLists datas={viewPosts} onOpenCafeRead={onOpenCafeRead} />
</InfiniteScroll>
</>
);
};
export default Component;
반응형
'개발 > React' 카테고리의 다른 글
[react] 검색어 자동완성 구현하기 (0) | 2022.10.06 |
---|---|
[react] throttle 적용하기 (0) | 2022.10.04 |
[react] 여러개 토글 버튼 구현 (0) | 2022.09.20 |
[react] resize 적용하는 법 (0) | 2022.09.13 |
[react] 하위 컴포넌트별로 특정 요소 on/off 설정 (0) | 2022.09.07 |
댓글