Toggle navigation
Toggle navigation
This project
Loading...
Sign in
Bruno Predot
/
tmdb_test
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Network
Create a new issue
Builds
Commits
Authored by
Bruno Predot
2025-04-24 16:08:50 +0200
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
3a4802735b639922517345b13c7672e16732ff0f
3a480273
1 parent
dde00afd
Création et gestion de l'observer pour le défilement infini.
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
37 additions
and
1 deletions
components/MoviesList.vue
components/MoviesList.vue
View file @
3a48027
<script lang="ts" setup>
//#region --import--.
import SearchBar from "~/components/SearchBar.vue";
import { ref } from "vue";
import {
onBeforeUnmount,
ref } from "vue";
import { useTMDB } from "~/composables/tMDB";
import { Movie } from "~/models/movie";
import { FilmIcon } from "lucide-vue-next";
...
...
@@ -18,6 +18,10 @@ const isInitialLoading = ref(true);
const isLoadingMore = ref(false);
const currentPage = ref(1);
const totalPages = ref(0);
/** Elément observé pour le défilement infini. */
const loadMoreTrigger = ref<HTMLElement | null>(null);
/** Instance de IntersectionObserver */
const observer = ref<IntersectionObserver | null>(null);
//#endregion
//#region --Computed--.
...
...
@@ -47,12 +51,41 @@ const fetchMovies = async (page: number) => {
isLoadingMore.value = false;
}
};
function createIntersectionObserver() {
return new IntersectionObserver(
(entries) => {
const [entry] = entries;
if (entry.isIntersecting && !isLoadingMore.value && currentPage.value < totalPages.value) {
fetchMovies(currentPage.value + 1);
}
},
{ threshold: 1.0 },
);
}
//#endregion
//#region --Global event--.
onMounted(() => {
// Chargement des premiers films.
fetchMovies(1);
// Création et stockage dans la ref de l'instance IntersectionObserver.
observer.value = createIntersectionObserver();
if (loadMoreTrigger.value) {
// Début d'observation de la div pour le défilement infini.
observer.value.observe(loadMoreTrigger.value);
}
if (loadMoreTrigger.value) {
observer.value.observe(loadMoreTrigger.value);
}
});
onBeforeUnmount(() => {
// Disconnect the observer when the component is unmounted
if (observer.value) {
observer.value.disconnect();
}
});
//#endregion
</script>
...
...
@@ -94,6 +127,9 @@ onMounted(() => {
</div>
</div>
</div>
<!-- Élément observé pour le défilement infini -->
<div ref="loadMoreTrigger" class="h-10 mt-4"/>
</section>
</template>
...
...
Please
register
or
login
to post a comment