강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

kyung3098님의 프로필 이미지
kyung3098

작성한 질문수

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

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

스크롤링 success 문제

작성

·

329

·

수정됨

0

안녕하세요 제로초님

인피니트 스크롤링 적용하는 부분에서 스크롤이 끝에 올 때마다 mainPosts가 10개씩 추가 되지 않고 한번에 50개(

draft.hasMorePost = draft.mainPosts.length < 50;

)가 추가 되는데 원래라면 스크롤을 끝까지 내릴 때마다 10개씩만 추가 되어야 하는 건가요?

댓글에서 SUCCESS는 한 번만 와야 된다고 하셨는데 저는 처음 한 번만 게시글이 10개 추가(success 한 번)되고 이후에는 게시글이 50개가 될 때까지 한꺼번에 success가 들어옵니다

콘솔에 inView를 찍어보니 처음 10개만 들어왔을 때는 true -> false로 값의 변화가 있는데 한번에 success 되는 부분에서의 inView의 값은 계속 true로 찍힙니다..

이런 경우에는 어떻게 해결해야 되나요..??

index.js

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

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

  return (
    <AppLayout>
      {me && <PostForm />}
      {mainPosts.map((post) => <PostCard key={post.id} post={post} />)}
      <div ref={hasMorePost && !loadPostsLoading ? ref : undefined} style={{ height: 10, backgroundColor: 'red' }} />
    </AppLayout>
  );

 

답변 1

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

LOAD_POSTS_REQUEST 액션이 여러 번 호출되는 건가요??

kyung3098님의 프로필 이미지
kyung3098
질문자

넵!! 한번에

LOAD_POSTS_REQUEST

LOAD_POSTS_SUCCESS

LOAD_POSTS_REQUEST

LOAD_POSTS_SUCCESS

LOAD_POSTS_REQUEST

LOAD_POSTS_SUCCESS

이렇게 찍힙니다!!

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

useEffect 안에서 첫줄에 console.log inView 찍어보세요

kyung3098님의 프로필 이미지
kyung3098
질문자

1.png액션이 여러 번 찍히는 부분은 세 번째 false 이후 true 부분 입니다

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

아 이게 inView는 변한게 없는데 hasMorePost랑 loadPostLoading이 바뀌면서 일어나는 일이네요.

inView가 false에서 true로 바뀔 때만 불러오도록 수정해야할 것 같습니다. false에서 true로 바뀌는지는 useRef 활용해서 할 수 있습니다.

kyung3098님의 프로필 이미지
kyung3098
질문자

넵 알려주신 방법대로 해보겠습니다 감사합니다!!!

kyung3098님의 프로필 이미지
kyung3098

작성한 질문수

질문하기