Quick Demo
Where going to create a simple example using vite and vuejs 3
I'v already made a live demo you can check it out Demo Netlify
create a new project
bash
npm init vite@latest infinite-demo --template vue
bash
cd infinite-demo && npm install
Install our infinite loading component
bash
npm install v3-infinite-loading
Implementation
Go to App.vue component and override the script with this one We're using {JSON} Placeholder API to get some dummy data
html
<script setup>
import { ref } from 'vue'
import InfiniteLoading from 'v3-infinite-loading'
import 'v3-infinite-loading/lib/style.css'
let comments = ref([])
let page = 1
const load = async ($state) => {
console.log('loading...')
try {
const response = await fetch(
'https://jsonplaceholder.typicode.com/comments?_limit=10&_page=' +
page
)
const json = await response.json()
if (json.length < 10) $state.complete()
else {
comments.value.push(...json)
$state.loaded()
}
page++
} catch (error) {
$state.error()
}
}
</script>
Now let's add a template to display the results
html
<template>
<div class="result" v-for="comment in comments" :key="comment.id">
<div>{{ comment.email }}</div>
<div>{{ comment.id }}</div>
</div>
<InfiniteLoading @infinite="load" />
</template>
Lets add a bit of css style
html
<style>
#app {
font-family: Avenir, Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
.result {
display: flex;
flex-direction: column;
gap: 5px;
font-weight: 300;
width: 400px;
padding: 10px;
text-align: center;
margin: 0 auto 10px auto;
background: #eceef0;
border-radius: 10px;
}
</style>
Start the dev server
bash
npm run dev
And congrats you made it 🎉