inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[리뉴얼] React로 NodeBird SNS 만들기

인피니트 스크롤링 적용하기

인피니트 스크롤링 lastId

235

huhu

작성한 질문수 11

0

안녕하세요 제로초님 강의 잘 보고 있습니다.

다름이 아니라 강의 소식에서 본

Intersection Observer 를 사용한 인피니트 스크롤링을 보고 궁금한 것이 있어 질문을 드립니다.

lastId 없이 디스패치해도 게시물들이 나오던데

lastId를 같이 디스패치 하신 이유가 무엇인지

감이 안 잡혀 질문 드립니다!

 

import React, { useEffect } from "react";
import { useDispatch, useSelector } from "react-redux";
import AppLayout from "../components/AppLayout";
import PostCard from "../components/PostCard";
import PostForm from "../components/PostForm";
import { LOAD_POSTS_REQUEST } from "../reducers/post";

// 어떤 Element가 화면(viewport)에 노출되었는지를 감지할 수 있는 API
import { useInView } from 'react-intersection-observer';

const Home = () => {
    const dispatch = useDispatch();
    const { me } = useSelector((state) => state.user);
    const { mainPosts, hasMorePosts, loadPostsLoading  } = useSelector((state) => state.post);
    const [ref, inView] = useInView();

    // 처음 게시물들 불러올 때
    useEffect(() => {
        dispatch({
            type: LOAD_POSTS_REQUEST,
        });
    }, []);

    useEffect(() => {
        if (inView && hasMorePosts && !loadPostsLoading) {
            const lastId = mainPosts[mainPosts.length - 1]?.id;
            dispatch({
                type: LOAD_POSTS_REQUEST,
                lastId,
            });
        }
    }, [inView, hasMorePosts, loadPostsLoading, mainPosts]);

    /*
        더 보여줄 게시물이 있고, 게시물을 보여주기 위한 로딩 중이 아닐 때
        + PostCard들 아래에 위치한 div가 화면에 보일 때(마지막 게시글을 봤다는 얘기)
        => inView가 true가 되면서 두 번째 useEffect가 작동함.
        => 마지막 게시글에 가까워질 때쯤 불러오도록 수정함.
    */
    return (
        <AppLayout>
            {me && <PostForm />}
            {mainPosts.map((post, i) => {
                    if (i === mainPosts.length - 3) {
                        return (
                            <>
                                <div ref={hasMorePosts && !loadPostsLoading ? ref : undefined} />
                                <PostCard key={post.id} post={post} />
                            </>
                        )
                    }
                    return <PostCard key={post.id} post={post} />
                })
            }
        </AppLayout>
    )
}

export default Home;

react redux express nodejs Next.js

답변 1

0

제로초(조현영)

lastId가 있어야지만 그 다음 게시물이 로딩이 될텐데요?

0

huhu

아 lastId가 지금 시점이 아니라 나중에 필요한 거였네요!
어쩐지 지금 상황에선 없어도 되더라니...!!
바쁘실텐데 답변 주셔서 감사합니다.
차차 강의 더 따라 진행하면서 이해하겠습니다!!!

넥스트 버젼 질문

0

90

2

로그인시 401 Unauthorized 오류가 뜹니다

0

104

1

무한 스크롤 중 스크롤 튐 현상

0

192

1

특정 페이지 접근을 막고 싶을 때

0

116

2

createGlobalStyle의 위치와 영향범위

0

102

2

인라인 스타일 리렌더링 관련

0

97

2

vsc 에서 npm init 설치시 오류

0

157

2

nextjs 15버전 사용 가능할까요?

0

166

1

화면 새로고침 문의

0

129

1

RTK에서 draft, state 차이가 있나요?

0

160

2

Next 14 사용해도 될까요?

0

455

1

next, node 버전 / 폴더 구조 질문 드립니다.

0

359

1

url 오류 질문있습니다

0

214

1

ssh xxxxx로 우분투에 들어가려니까 port 22: Connection timed out

0

391

1

sudo certbot --nginx 에러

0

1293

2

Minified React error 콘솔에러 (hydrate)

0

477

1

카카오 공유했을 때 이전에 작성했던 글이 나오는 버그

0

255

1

프론트서버 배포 후 EADDRINUSE에러 발생

0

337

1

npm run build 에러

0

525

1

front 서버 npm run build 중에 발생한 에러들

0

399

1

서버 실행하고 브라우저로 들어갔을때 404에러

0

350

2

css 서버사이드 랜더링이 적용되지 않아서 문의 드립니다.

0

290

1

팔로워 3명씩 불러오고 데이터 합쳐주는걸로 바꾸고 서버요청을 무한으로하고있습니다.

0

249

2

해시태그 검색에서 throttle에 관해 질문있습니다.

0

206

1