이 종합 가이드에서는 Inertia.js v2.0 및 Vue 3을 사용하여 Laravel 애플리케이션에서 무한 스크롤을 구현하는 방법을 살펴보겠습니다. 프런트엔드와 백엔드를 모두 다룰 것입니다. 전체 페이지 새로 고침 처리 및 스크롤 위치 유지에 특별한 주의를 기울여 구현했습니다.
무한 스크롤 구현은 세 가지 주요 구성 요소에 의존합니다.
블로그 게시물 목록에 대해 무한 스크롤을 구현하는 Vue 구성 요소부터 시작해 보겠습니다.
<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'], }"
다음은 일반 페이지 매김과 전체 페이지 로드 시나리오를 모두 처리하는 Laravel 컨트롤러 구현입니다.
<?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();
Laravel 및 Inertia.js v2.0으로 무한 스크롤을 구현하면 우수한 성능과 SEO 관행을 유지하면서 원활한 사용자 경험을 제공합니다. Vue 3의 Composition API와 Inertia.js의 WhenVisible 구성 요소를 결합하면 구현 및 유지 관리가 쉬워집니다.
다음 사항을 기억하세요.
이 구현은 블로그 게시물 외에도 제품 목록, 이미지 갤러리 또는 무한 스크롤의 이점을 활용하는 기타 콘텐츠 등 다양한 사용 사례에 맞게 조정할 수 있습니다.
위 내용은 Laravel, Inertia.js v 및 Vue 3을 사용하여 무한 스크롤 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!