Rumah >hujung hadapan web >tutorial js >Melaksanakan Tatal Infinite dengan Laravel, Inertia.js v dan Vue 3

Melaksanakan Tatal Infinite dengan Laravel, Inertia.js v dan Vue 3

Linda Hamilton
Linda Hamiltonasal
2024-12-20 21:17:15320semak imbas

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

Dalam panduan komprehensif ini, kami akan meneroka cara melaksanakan penatalan tak terhingga dalam aplikasi Laravel menggunakan Inertia.js v2.0 dan Vue 3. Kami akan merangkumi kedua-dua bahagian hadapan dan bahagian belakang pelaksanaan, dengan perhatian khusus untuk mengendalikan penyegaran halaman penuh dan mengekalkan kedudukan tatal.

Jadual Kandungan

  • Memahami Komponen
  • Pelaksanaan Depan
  • Pelaksanaan Belakang
  • Contoh Dunia Sebenar: Catatan Blog dengan Kategori
  • Amalan dan Pertimbangan Terbaik

Memahami Komponen

Pelaksanaan tatal tanpa had bergantung pada tiga komponen utama:

  1. Komponen WhenVisible Inertia.js v2.0: Komponen ini mengendalikan logik pemerhati persimpangan untuk mengesan apabila kita perlu memuatkan lebih banyak kandungan.
  2. Penomboran Laravel: Mengendalikan logik penomboran sebelah pelayan.
  3. API Komposisi Vue 3: Mengurus keadaan bahagian hadapan dan kereaktifan kami.

Pelaksanaan Frontend

Mari kita mulakan dengan komponen Vue yang melaksanakan tatal tak terhingga untuk penyenaraian catatan 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'],
}"
  • data: Menentukan halaman seterusnya untuk dimuatkan
  • sahaja: Mengoptimumkan permintaan dengan hanya mengambil data yang diperlukan
  1. Keadaan Memuatkan: Komponen mengendalikan kedua-dua keadaan pemuatan dan akhir kandungan dengan elegan.

Pelaksanaan Bahagian Belakang

Berikut ialah pelaksanaan pengawal Laravel yang mengendalikan kedua-dua penomboran biasa dan senario pemuatan halaman penuh:

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

Ciri Bahagian Belakang Utama

  1. Pengendalian Penomboran:
if (!request()->header('X-Inertia')) {
    // Full page load logic
} else {
    // Regular pagination for infinite scroll
}
  1. Muatan Halaman Penuh: Apabila pengguna memuat semula atau terus melawat halaman, kami mengambil semua halaman sebelumnya untuk mengekalkan kedudukan tatal yang betul:
for ($page = 1; $page <= $currentPage; $page++) {
    $pageResults = $query->paginate($perPage, ['*'], 'page', $page);
    $allResults = $allResults->concat($pageResults->items());
}
  1. Penyoalan Cekap: Pelaksanaan termasuk pemuatan bersemangat perhubungan dan pertanyaan berskop:
$query = Post::query()
    ->with(['author', 'category'])
    ->published();

Kesimpulan

Melaksanakan penatalan tanpa had dengan Laravel dan Inertia.js v2.0 memberikan pengalaman pengguna yang lancar sambil mengekalkan prestasi yang baik dan amalan SEO. Gabungan API Komposisi Vue 3 dan komponen WhenVisible Inertia.js menjadikannya mudah untuk dilaksanakan dan diselenggara.

Ingat kepada:

  • Uji pelaksanaan dengan teliti, terutamanya untuk kes tepi
  • Pantau metrik prestasi
  • Pertimbangkan untuk melaksanakan sandaran untuk pengguna dengan JavaScript dilumpuhkan
  • Ingat kebolehaksesan apabila melaksanakan tatal tak terhingga

Pelaksanaan ini boleh disesuaikan untuk pelbagai kes penggunaan di luar catatan blog, seperti penyenaraian produk, galeri imej atau mana-mana kandungan lain yang mendapat manfaat daripada penatalan tanpa had.

Sumber Tambahan

  • Dokumentasi Inertia.js
  • Dokumentasi Laravel
  • Dokumentasi Vue 3
  • Garis Panduan Kebolehcapaian Web untuk Tatal Infinite

Atas ialah kandungan terperinci Melaksanakan Tatal Infinite dengan Laravel, Inertia.js v dan Vue 3. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn