무한스크롤을 구현하기 위해서 컴포넌트의 최대높이가 현재 스크롤위치와 비슷해질 때를 찾아서 데이터를 추가로 받는다.
🧨 참고: Vue에서 무한스크롤을 지원하는 라이브러리가 존재합니다! 아래는 Vue의 환경에서 JS를 사용해서 하는 구현하는 방법입니다.
📌 Vue의 Lifecycle Hook에 대한 이해가 필요합니다.
created()
에이벤트리스너
를 등록해두면, 컴포넌트가 생성될 때이벤트리스너
를 생성합니다.
export default {
created() {
window.addEventListener("scroll", this.handleScroll)
}
}
this.$refs.scrollcheck.scrollHeight
는 ref
를 사용해서 직접 참조 할 컴포넌트를 지정해서 해당 컴포넌트의 최대높이를 참조할 수 있습니다.(window.innerHeight + window.scrollY)
는 각각<template>
<div ref="scrollcheck">
...
</div>
</template>
export default {
...
methods:{
handleScroll() {
if (this.$refs.scrollcheck.scrollHeight - (window.innerHeight + window.scrollY) < 1000){
...
}
}
}
}
ref
로 지정하고 , 보여질 영화를 Index만큼 slice
로 자릅니다. 🧨 다른 방안
this.visibleIdx...
부분을exios
요청으로 추가 데이터를 받는 방식으로 하는 방안도 좋습니다.
<template>
<div ref="scrollcheck">
<article
v-for="movie in filteredMovies.slice(0, visibleIdx)"
:key="movie.id"
>
<MovieItem :movie="movie"/>
</article>
</div>
</template>
export default {
data() {
return {
visibleIdx: 100, // 보여질 영화의 개수
}
},
methods:{
handleScroll() {
if (this.$refs.scrollcheck.scrollHeight - (window.innerHeight + window.scrollY) < 1000){
this.visibleIdx += 100 // 보여질 영화의 개수를 추가한다.
}
}
}
}
🧨 삭제해야하는 이유
삭제하지 않으면, 컴포넌트가 생성될 때마다이벤트리스너
가 생성되고, 다른 페이지에 갔을 때도이벤트리스너
가 계속 감시하고 있어 해당 오류가 발생합니다.
beforeDestroy() {
window.removeEventListener('scroll', this.handleScroll);
}