inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

Vue 3 & Firebase 10 커뮤니티 만들기 풀스택 - "활용편" (with Pinia, Quasar, Tiptap, VueUse)

무한 스크롤링 구현 : Web API IntersectionObserver

무한 스크롤링 질문

77

하히호

작성한 질문수 2

0

<div v-intersectionObserver="handleIntersectionObserver" class="bg-primary"></div>

여기 div에 height 100px 했을때는 스크롤해서 하단에 닿이면 6개씩 잘보였는데 style 부분을 지우니까 스크롤 해서 하단에 닿였을때 나머지 게시물이 6개씩 보이는게 아니라 loadMore() 이 연속적으로 실행되어 전체가 다 보이게 됩니다

 height가 0이 되면서 계속 노출이 돼서 그렇게 되는건가요?

vue.js firebase quasar algolia vue-3

답변 2

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. 최호연님.

무한 스크롤을 구현할 때 v-intersectionObserver 디렉티브를 사용하신 것 같습니다. 이 디렉티브는 특정 요소가 뷰포트 내에 진입하거나 나갈 때 콜백 함수를 실행시키는 역할을 합니다.

말씀하신 문제가 발생하는 이유는, height가 없는 상태에서는 div 요소가 화면에 항상 노출되어 있기 때문입니다. IntersectionObserver는 해당 요소가 뷰포트 내에 있음을 계속해서 감지하게 되고, 따라서 loadMore() 함수가 여러 번 호출되어 모든 게시물이 한 번에 로드되는 것입니다.

무한 스크롤의 올바른 동작을 위해서는 다음과 같은 방법을 사용할 수 있습니다:
1. 높이 조정: div의 높이를 명시적으로 설정하여 뷰포트 하단에 도달할 때만 IntersectionObserver가 트리거되도록 합니다. 현재 height: 100px으로 설정되어 있을 때 동작이 제대로 된다고 하신 점을 고려하면, 이 설정을 유지하는 것이 좋을 것 같습니다.

  1. 마진 사용: margin이나 padding을 적절히 사용하여 요소가 뷰포트 내에서 약간의 여유 공간을 갖도록 조정할 수 있습니다.

  2. 비율 설정: IntersectionObserver의 옵션으로 threshold 옵션을 활용하여 요소가 얼마나 보일 때 콜백이 실행될지를 결정할 수도 있습니다.

유사한 질문과 해결 방법에 대한 링크를 참조하시길 권장합니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

0

짐코딩

네, 맞아요! 높이가 0이 되면서 계속 노출되어 loadMore()가 연속 실행되는 것이 원인입니다.

해결방법

최소 높이 설정:

<div 
  v-intersectionObserver="handleIntersectionObserver" 
  class="bg-primary"
  style="height: 1px;"
></div>

또는 로딩 상태로 중복 호출 방지:

const isLoading = ref(false)

const handleIntersectionObserver = async ([{ isIntersecting }]) => {
  if (isIntersecting && !isLoading.value) {
    isLoading.value = true
    await loadMore()
    isLoading.value = false
  }
}

핵심은 트리거 요소가 항상 보이지 않도록 최소한의 높이를 주거나, 중복 실행을 막는 플래그를 사용하는 것입니다.

storage 사용 문의

0

71

2

짐코딩님..! unplugin-vue-router/vite 적용 최근방식 부탁드령요 ㅜㅜ

0

147

3

Quasar를 강의 버전 그대로 맞추면 실행할 때 에러가 발생해서, 다른 버전만 맞추니 잘 작동합니다.

1

93

1

post/[id]/index.vue에서 layouts/default.vue가 안 나오는 데 어떤 이유일까요?

0

137

2

Cross-Origin-Opener-Policy policy would block the window.closed call.

0

423

2

[공유] 잘동작하는 unplugin-vue-router 버전 관련

0

262

2

route.meta? 에서 물음표 개념

0

116

2

functions.region is not a function

1

219

1

unplugin-vue-router 가 안되네요.

0

266

2

건의사항

0

177

1

Firebase Hosting 후 페이지 안뜰 때!

0

179

1

type : negative 무슨 의미인가요?

0

191

2

강의 교안은 어떻게 볼 수 있나요?

0

260

2

플로그인 설치

0

231

2

Firebase 요금제에 관한 문의사항

0

280

1

사용자 컴포넌트를 작성하는 것에 대한 문의

0

173

1

Firebase 강의 Section1의 Auto page 설정에 관련되어

0

342

2

tiptap 스타일 파일은 따로 안 올려주시나요?

0

353

1

LocalStorage 값 변경 자동 체크

0

532

1

Volar Deprecated

0

669

1

호스팅 문제 관련 질문 있습니다.

0

220

1

안녕하세요!

0

282

1

emit, prop 대신 defineModel()을 사용하여 구현 하는 것에 대한 질문 입니다.

0

662

1

안녕하세요! tiptap 강의 듣는중인데

0

344

1