infinite scrolling firestore vuejs

Infinite Scrolling in Firestore with Vue.js

Firestore is a NoSQL document-oriented database provided by Google Cloud Platform. It is widely used in modern web development because of its scalability, automatic syncing of data, and ability to handle real-time updates. Vue.js is a progressive JavaScript framework that makes it easy to build user interfaces. One of the common features in web applications is infinite scrolling where data is loaded dynamically as the user scrolls down the page. This tutorial will explain how to implement infinite scrolling in Firestore with Vue.js.

Step 1: Install Firebase and Vue.js

Before we dive into the implementation part, we need to install Firebase and Vue.js. We can use npm to install these packages:

npm install firebase vue

Step 2: Set up Firebase Configuration

Next, we need to set up our Firebase configuration by creating a new Firebase project and obtaining the configuration details. We can do this by going to the Firebase console and creating a new project. Once created, we can go to the project settings and copy the configuration details into our Vue.js application:

import firebase from 'firebase/app'
import 'firebase/firestore'

const firebaseConfig = {
  // your firebase config details here


export const db = firebase.firestore()

Step 3: Fetch Data from Firestore

Once we have set up our Firebase configuration, we can fetch data from Firestore by using the limit() and startAfter() methods. We can use the limit() method to specify the number of documents to fetch and the startAfter() method to specify the starting point of the query:

const fetchPosts = async (lastPost) => {
  let query = db.collection('posts').orderBy('createdAt', 'desc').limit(10)
  if (lastPost) {
    query = query.startAfter(lastPost.createdAt)

  const snapshot = await query.get()

  const posts = => {
    return { id:, }

  return posts

Step 4: Implement Infinite Scrolling

Now that we can fetch data from Firestore, we can implement infinite scrolling by adding a scroll event listener to the container element:

< template>
  < div ref="container" @scroll="handleScroll">
    < ul>
      < li v-for="post in posts" :key="">{{ post.title }}
    < div v-if="fetching">Loading...

< script>
import { ref, reactive } from 'vue'
import { fetchPosts } from './firebase'

export default {
  setup() {
    const state = reactive({
      posts: [],
      lastPost: null,
      fetching: false

    const container = ref(null)

    const handleScroll = async () => {
      if (container.value.scrollTop + container.value.clientHeight >= container.value.scrollHeight && !state.fetching) {
        state.fetching = true

        const posts = await fetchPosts(state.lastPost)
        state.posts = [...state.posts, ...posts]

        if (posts.length) {
          state.lastPost = posts[posts.length - 1]

        state.fetching = false

    return {

In the code above, we are using the ref() function from Vue to create a reference to the container element. We are also using the reactive() function to create a reactive state object that contains the fetched posts, the last post fetched, and a boolean flag to indicate if data is currently being fetched. We then define a handleScroll() function that checks if the user has scrolled to the bottom of the container element, and if so, fetches the next batch of posts from Firestore. We then update our state object with the new posts, set the last post to be the last post fetched, and set the fetching flag to false.


Infinite scrolling is a common feature in modern web applications that makes it easy for users to navigate through large amounts of data. Firestore is a powerful NoSQL database provided by Google Cloud Platform that makes it easy to store and fetch data in real-time. With Vue.js, we can easily implement infinite scrolling in Firestore by fetching data dynamically as the user scrolls down the page.

Subscribe to The Poor Coder | Algorithm Solutions

Don’t miss out on the latest issues. Sign up now to get access to the library of members-only issues.
[email protected]