August 17, 2023 vue

Vue Infinite Scroll

Infinite Scroll adalah cara menampilkan konten secara terus menerus ketika user melakukan scroll.

Contoh dari penerapan infinite scroll adalah pada aplikasi sosial media, ketika user melakukan scroll ke bawah, konten akan ditampilakan secara terus menerus.

Untuk menerapkan infinite scroll di vue anda bisa memanfaakan event scroll pada element yang menampilkan konten.

<div v-on:scroll="handleScroll">
    <!-- content -->
</div>

Kemudian tangkap event scroll, cek apakah scroll tersebut mencapai batas paling bawah konten.

  • Gunakan scrollTop untuk mendapatkan posisi scroll hoizontal dari elemen
  • Gunakan scrollHeight - clientHeight untuk mendapatkan tinggi elemen

Bandingkan nilai scrollTop dan scrollHeight - clientHeight, jika lebih besar maka scroll mencapai batas paling bawah konten.

async function handleScroll(e) {
    if (e.target.scrollTop >= e.target.scrollHeight - e.target.clientHeight) {
        // handle infinite scroll
    }
}

Berikut implementasi lengkapnya.

<script setup>
import { ref } from 'vue'
import { getPosts } from './post.api.js'

const posts = ref([])
const postsSize = ref(10)

async function loadPosts() {
    posts.value = await getPosts({
        size: postsSize.value
    })
}

async function handleScrollPosts(e) {
    if (e.target.scrollTop >= e.target.scrollHeight - e.target.clientHeight) {
        postsSize.value += 10

        await loadPosts()
    }
}

loadPosts()
</script>

<template>
    <div v-on:scroll="handleScrollPosts">
        <div v-for="post in posts" :key="post.id">
            <h1>{{ post.name }}</h1>
            <p>{{ post.content }}</p>
        </div>
    </div>
</template>