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
- 리액트네이티브 검색
- 플랫리스트
- 자바스크립트
- 네이티브 css
- react native routes
- 리액트 사진크기
- 리액트쿼리 무한스크롤
- 전역상태관리
- FlatList
- JavaScript
- 리액트 네이티브 캐러셀
- 리액트
- HTML
- react native navigation
- React Native
- React-qurey
- 리액트쿼리
- 리액트 네이티브 map
- 프론트엔드 개발블로그
- 리액트 네이티브
- 리액트네이티브 라우트
- 무한스크롤
- expo-location
- react
- 리액트 무한스크롤
- 부트캠프항해
- react-native
- 리액트 네이티브 네비게이션
- ui로직
- 비지니스로직
Archives
- Today
- Total
솧디의 개발로그
react query로 무한스크롤 구현하기 본문

import { useQuery, useInfiniteQuery } from "@tanstack/react-query";
import { useInView } from "react-intersection-observer";
import { useEffect } from "react";
import { useNavigate } from "react-router-dom";
import { useDeleteDetailPost } from "../../querys/detail";
import axios from "axios";
import { Box } from "../../components";
import { Board } from "./board";
const MyBoard = () => {
const BASE_URL = process.env.REACT_APP_SERVER;
const navigate = useNavigate();
//로컬스토리지 토큰가져오기
const authorization = localStorage.getItem("Authorization");
//내가쓴게시물 get요청
const { data, status } = useQuery(
["getMyBoard"],
async () => {
const response = await axios.get(
`${BASE_URL}/member/auth/mypage/boards`,
{
headers: {
authorization,
},
},
);
return response.data;
},
{
if(isError) {
alert("내가 작성한 게시물 불러오기 실패");
},
},
);
위는 기존의 겟 요청이고, 한번에 다불러오는 로직이다. 이렇게되면 한번에 많은 정보들이 다 로딩되기에 좋지않다.
import { useQuery, useInfiniteQuery } from "@tanstack/react-query";
import { useInView } from "react-intersection-observer";
import { useEffect } from "react";
import { useNavigate } from "react-router-dom";
import { useDeleteDetailPost } from "../../querys/detail";
import axios from "axios";
import { Box } from "../../components";
import { Board } from "./board";
const BASE_URL = process.env.REACT_APP_SERVER;
const authorization = localStorage.getItem("Authorization");
const fetchPostList = async pageParam => {
const { data } = await axios.get(
`${BASE_URL}/member/auth/mypage/boards?page=${pageParam}&size=3`,
{
headers: {
authorization,
},
},
);
const { myPageList: page, isLast } = data;
return { page, nextPage: pageParam + 1, isLast };
};
const MyBoard = () => {
const navigate = useNavigate();
const { ref, inView } = useInView();
const { data, status, fetchNextPage, isFetchingNextPage } = useInfiniteQuery(
["page"],
({ pageParam = 1 }) => fetchPostList(pageParam),
{
getNextPageParam: lastPage =>
!lastPage.isLast ? lastPage.nextPage : undefined,
},
);
console.log("data.pages===>", data?.pages);
useEffect(() => {
if (inView) fetchNextPage();
}, [inView]);
if (status === "loading") return <p>로딩중</p>;
if (status === "error") return <p>에러입니다.</p>;
return (
<Box>
<Board
data={data}
navigate={navigate}
onDeletePost={handelDeletePost}
onEditPost={handleEditPost}
/>
{isFetchingNextPage ? <p>로딩중</p> : <div ref={ref}></div>}
</Box>
);
};
export default MyBoard;
그래서 무한스크롤로 교체하는 작업을 하였고 useInfiniteQuery를 이용해 무한스크롤을 구현하였다.
정보가 끝나는 부분에 ref를 넣어 마지막페이지 여부를 확인하였다.
ui로직을 미리 구분해놓은 컴포넌트 덕분에 간단하게 무한스크롤을 적용할수있었다.
또한 status를 통한 로딩중,에러처리문은 상단에 있을시 오류가 나기에 로직 맨 마지막에 위치하는것이 좋다.
'React 리액트 > React 리액트' 카테고리의 다른 글
| React 전역상태관리를 리덕스에서 리코일로 바꾼이유! (1) | 2022.12.18 |
|---|---|
| React-qurey 무한스크롤 리랜더링발생 해결방안 (토큰문제) (0) | 2022.12.18 |
| React 비지니스로직, UI로직 분리하기, 효율적인 폴더구조 짜기 (0) | 2022.12.05 |
| [react] props 상위컴포넌트에서 조건error (0) | 2022.11.20 |
| label for 태그 오류? htmlFor로 해결! (0) | 2022.11.13 |
Comments