Dans ce guide complet, nous explorerons comment implémenter le défilement infini dans une application Laravel à l'aide d'Inertia.js v2.0 et Vue 3. Nous couvrirons à la fois le frontend et le backend mise en œuvre, avec une attention particulière à la gestion des actualisations de page complète et au maintien de la position de défilement.
L'implémentation du défilement infini repose sur trois composants principaux :
Commençons par un composant Vue qui implémente le défilement infini pour la liste d'articles de blog :
<script setup> import { computed } from 'vue' import { usePage, WhenVisible } from '@inertiajs/vue3' import LoadingSpinner from '@/components/LoadingSpinner.vue' import BlogPostCard from '@/components/BlogPostCard.vue' const page = usePage() const hasFeaturePost = computed(() => !!page.props.featuredPost) const categoryName = computed(() => page.props.category?.name) </script> <template> <div> <h3> Key Frontend Features </h3> <ol> <li><p><strong>WhenVisible Component</strong>: This component from Inertia.js v2.0 automatically triggers a request when the element becomes visible in the viewport.</p></li> <li><p><strong>Pagination Parameters</strong>:<br> </p></li> </ol> <pre class="brush:php;toolbar:false">:params="{ data: { page: page.props.postsPagination.current_page + 1, }, only: ['posts', 'postsPagination'], }"
Voici l'implémentation du contrôleur Laravel qui gère à la fois les scénarios de pagination régulière et de chargement de page complète :
<?php namespace App\Http\Controllers; use App\Models\Post; use App\Models\Category; use Illuminate\Pagination\LengthAwarePaginator; use Inertia\Inertia; class BlogController extends Controller { public function index(?Category $category = null) { return Inertia::render('Blog/Index', [ 'category' => $category, 'featuredPost' => $this->getFeaturedPost(), 'posts' => $this->getPaginatedPosts($category), 'postsPagination' => $this->getPaginatedPosts($category)?->toArray(), ]); } protected function getPaginatedPosts(?Category $category): ?LengthAwarePaginator { $currentPage = request()->input('page', 1); $perPage = request()->input('per_page', 12); $query = Post::query() ->with(['author', 'category']) ->published(); if ($category) { $query->where('category_id', $category->id); } // Apply any additional filters if (request()->has('sort')) { $query->orderBy(request()->input('sort'), request()->input('direction', 'desc')); } else { $query->latest(); } // Handle full page load vs. infinite scroll request if (!request()->header('X-Inertia')) { // Full page load - fetch all pages up to current $allResults = collect(); for ($page = 1; $page <= $currentPage; $page++) { $pageResults = $query->paginate($perPage, ['*'], 'page', $page); $allResults = $allResults->concat($pageResults->items()); } return new LengthAwarePaginator( $allResults, Post::query() ->published() ->when($category, fn($q) => $q->where('category_id', $category->id)) ->count(), $perPage, $currentPage ); } return $query->paginate($perPage); } protected function getFeaturedPost() { return Post::query() ->with(['author', 'category']) ->published() ->featured() ->latest() ->first(); } }
if (!request()->header('X-Inertia')) { // Full page load logic } else { // Regular pagination for infinite scroll }
for ($page = 1; $page <= $currentPage; $page++) { $pageResults = $query->paginate($perPage, ['*'], 'page', $page); $allResults = $allResults->concat($pageResults->items()); }
$query = Post::query() ->with(['author', 'category']) ->published();
La mise en œuvre du défilement infini avec Laravel et Inertia.js v2.0 offre une expérience utilisateur fluide tout en conservant de bonnes performances et pratiques de référencement. La combinaison de l'API Composition de Vue 3 et du composant WhenVisible d'Inertia.js facilite la mise en œuvre et la maintenance.
N'oubliez pas de :
Cette implémentation peut être adaptée à divers cas d'utilisation au-delà des articles de blog, tels que des listes de produits, des galeries d'images ou tout autre contenu bénéficiant d'un défilement infini.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!