Heim >Web-Frontend >js-Tutorial >Implementierung von Infinite Scrolling mit Laravel, Inertia.js v und Vue 3

Implementierung von Infinite Scrolling mit Laravel, Inertia.js v und Vue 3

Linda Hamilton
Linda HamiltonOriginal
2024-12-20 21:17:15222Durchsuche

Implementing Infinite Scrolling with Laravel, Inertia.js v, and Vue 3

In diesem umfassenden Leitfaden erfahren Sie, wie Sie mit Inertia.js v2.0 und Vue 3 unendliches Scrollen in einer Laravel-Anwendung implementieren. Wir behandeln sowohl das Frontend als auch das Backend Implementierung, mit besonderem Augenmerk auf die Handhabung ganzer Seitenaktualisierungen und die Beibehaltung der Bildlaufposition.

Inhaltsverzeichnis

  • Die Komponenten verstehen
  • Frontend-Implementierung
  • Backend-Implementierung
  • Beispiel aus der Praxis: Blog-Beiträge mit Kategorien
  • Best Practices und Überlegungen

Die Komponenten verstehen

Die Implementierung des unendlichen Scrollens basiert auf drei Hauptkomponenten:

  1. WhenVisible-Komponente von Inertia.js v2.0: Diese Komponente verwaltet die Schnittmengenbeobachterlogik, um zu erkennen, wann wir mehr Inhalte laden müssen.
  2. Laravels Paginierung: Verwaltet die serverseitige Paginierungslogik.
  3. Vue 3's Composition API: Verwaltet unseren Frontend-Status und unsere Reaktivität.

Frontend-Implementierung

Beginnen wir mit einer Vue-Komponente, die unendliches Scrollen für die Auflistung von Blogbeiträgen implementiert:

<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'],
}"
  • Daten: Gibt die nächste zu ladende Seite an
  • only: Optimiert die Anfrage, indem nur die erforderlichen Daten abgerufen werden
  1. Ladezustände: Die Komponente verwaltet sowohl den Lade- als auch den Endzustand des Inhalts elegant.

Backend-Implementierung

Hier ist die Laravel-Controller-Implementierung, die sowohl reguläre Paginierungs- als auch ganzseitige Ladeszenarien verarbeitet:

<?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();
    }
}

Wichtige Backend-Funktionen

  1. Paginierungshandhabung:
if (!request()->header('X-Inertia')) {
    // Full page load logic
} else {
    // Regular pagination for infinite scroll
}
  1. Vollständiges Laden der Seite: Wenn ein Benutzer eine Seite aktualisiert oder direkt besucht, rufen wir alle vorherigen Seiten ab, um die richtige Scroll-Position beizubehalten:
for ($page = 1; $page <= $currentPage; $page++) {
    $pageResults = $query->paginate($perPage, ['*'], 'page', $page);
    $allResults = $allResults->concat($pageResults->items());
}
  1. Effiziente Abfrage: Die Implementierung umfasst beziehungsbezogenes Eager Loading und bereichsbezogene Abfragen:
$query = Post::query()
    ->with(['author', 'category'])
    ->published();

Abschluss

Die Implementierung von unendlichem Scrollen mit Laravel und Inertia.js v2.0 sorgt für eine reibungslose Benutzererfahrung bei gleichzeitiger Beibehaltung guter Leistung und SEO-Praktiken. Die Kombination aus der Composition API von Vue 3 und der WhenVisible-Komponente von Inertia.js erleichtert die Implementierung und Wartung.

Denken Sie daran:

  • Testen Sie die Implementierung gründlich, insbesondere für Randfälle
  • Leistungskennzahlen überwachen
  • Erwägen Sie die Implementierung eines Fallbacks für Benutzer mit deaktiviertem JavaScript
  • Achten Sie bei der Implementierung von Infinite Scroll auf die Barrierefreiheit

Diese Implementierung kann für verschiedene Anwendungsfälle über Blog-Posts hinaus angepasst werden, z. B. Produktlisten, Bildergalerien oder andere Inhalte, die vom unendlichen Scrollen profitieren.

Zusätzliche Ressourcen

  • Inertia.js-Dokumentation
  • Laravel-Dokumentation
  • Vue 3-Dokumentation
  • Web-Barrierefreiheitsrichtlinien für Infinite Scroll

Das obige ist der detaillierte Inhalt vonImplementierung von Infinite Scrolling mit Laravel, Inertia.js v und Vue 3. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn