🤍 전 강의 25% 할인 중 🤍

2024년 상반기를 돌아보고 하반기에도 함께 성장해요!
인프런이 준비한 25% 할인 받으러 가기 >>

  • 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    미해결

SSR, react-intersection-observer 적용 시 문제

22.03.14 17:43 작성 조회수 531

0

안녕하십니까 좋은 강의 및 질문 답변에 항상 감사드립니다.

다름이 아니라 공지사항에 있는 글을 읽고 posts의 scrolling 을 react-intersection-observer를 적용해 보았습니다.

 

문제는 SSR 적용시 첫 로딩화면에서 scrolling 시 LOAD_POSTS_REQUEST가 dispatch되지 않는 것입니다.

 

console을 찍어보니 useEffect 조건 중 hasMorePosts와 loadPostsLoading은 각각 true, false로 만족하는데 lastId가 undefined가 나옵니다.

 

redux를 확인해봤을 때는 mainPosts의 글들이 보이는데 lastId는 왜 undefined인지 모르겠습니다.. 

 

혹시 ref나 inView 때문인가요?

 

처음 로딩시 redux 입니다.

(context.store.dispatch에 LOAD_POSTS_REQUEST를 넣어봐도 scrolling이 적용되지 않습니다.)

 

아래는 index.js의 코드입니다.

const Home = () => {
  const dispatch = useDispatch();
  const { me } = useSelector((state) => state.user);
  const { mainPosts, hasMorePosts, loadPostsLoading, retweetError } = useSelector((state) => state.post);

  useEffect(() => {
    if (retweetError) {
      alert(retweetError);
    }
  }, [retweetError]);

  const [ref, inView] = useInView();

  useEffect(
    () => {
      // 사용자가 마지막 요소를 보고 있고, 로딩 중이 아니라면..
      if (inView && hasMorePosts && !loadPostsLoading) {
        console.log('hasMorePosts', hasMorePosts);
        console.log('loadPostsLoading', loadPostsLoading);
        const lastId = mainPosts[mainPosts.length - 1]?.id;
        console.log('lastId', lastId);
        console.log('mainPosts', mainPosts);
        console.log('mainPosts[mainPosts.length - 1]', mainPosts);
        console.log('lastId', lastId);
        dispatch({
          type: LOAD_POSTS_REQUEST,
          lastId,
        });
      }
    },
    [inView, hasMorePosts, loadPostsLoading, mainPosts],
  );

  return (
    <AppLayout>
      {me && <PostForm />}
      {mainPosts.map((post) => <PostCard key={post.id} post={post} />)}
      <div ref={hasMorePosts && !loadPostsLoading ? ref : undefined} />
    </AppLayout>
  );
};

export const getServerSideProps = wrapper.getServerSideProps(async (context) => {
  // backend server에 쿠키 전달
  const cookie = context.req ? context.req.headers.cookie : '';
  axios.defaults.headers.Cookie = '';
  if (context.req && cookie) {
    axios.defaults.headers.Cookie = cookie;
  }
  context.store.dispatch({
    type: LOAD_MY_INFO_REQUEST,
  });
  // 위 코드까지 진행하면 Request만 진행하고 다시 client 페이지로 돌아온다.
  // 따라서 Success 까지 진행시키고 데이터를 받아오는 소스가 필요
  context.store.dispatch(END);
  // sagaTask는 configureStore.js 에서 정의
  await context.store.sagaTask.toPromise();
});

export default Home;
 

답변 1

답변을 작성해보세요.

0

저렇게 콘솔 쭈르륵 찍었을 때 콘솔 로그 어떻게 남나요?

윤동호님의 프로필

윤동호

질문자

2022.03.15

스크롤링이 제대로 작동하지 않을 때에는 아래와 같이 console 이 찍힙니다.

 

 아래 코드처럼 <div ref ... >을 post 위쪽에 넣으면 모든 게시물이 한 번에 다 보이는 것으로 봐서

모니터가 아래까지 내려갔다는 것을 인식하지 못해서 생기는 문제인가 싶습니다...

모니터 화면 큰 것으로 바꿔서도 해보았는데 되다 안되다 하는 문제는 똑같은 것 같습니다.

윤동호님의 프로필

윤동호

질문자

2022.03.15

( 수정 )

추가적으로 더 실행을 해본 결과 다음과 같은 버그가 발견됩니다.

1. . 총 29개의 post가 있다.

기본 페이지에서 스크롤링을 하면 10개를 더 불러와서 총 20개의 post는 보이지만 그 이상은 보이지 않는다.

즉, 스크롤링이 한 번만 작동

 

2. 스크롤링을 작동한 후(한 번 스크롤링을 하여 10개의  post를 불러온 이후)에 로그인을 하면 스크롤링이 한 번 더 적용이 잘 되어 총 29개의 post가 모두 보여진다.

하지만 새로고침을 하면 스크롤링이 아예 작동하지 않는다.

 

3. 노트북 기본 모니터가 아닌 30인치 모니터에서는 기본페이지(로그인X)에서 스크롤링이 작동하지 않고 로그인시에만 작동하는 버그가 있다.

 

어떤점이 문제인지조차 감이 잡히지가 않네요 ㅠㅠ

 

---------------------------- 수정 ---------------------------------

inView와 ref 다 콘솔 찍어보고 다른 방식으로 해보았다가 잘 안되서 다시 원상복구 시키니까 또 잘되네요....

뭐가 문제인지 정말 모르겠습니다..ㅠㅠ

div ref에 height를 50정도 줘보세요. 아마 공간이 없어서 안 됐을 겁니다.

윤동호님의 프로필

윤동호

질문자

2022.03.15

감사합니다. 훨씬 원활하게 스크롤링이 잘 됩니다 !

채널톡 아이콘