Laravel 9 Vue 3 Pagination with Vite Example

Laravel 9 , Vue.Js

Nicesnippets

23-07-2022


Laravel 9 Vue 3 Pagination with Vite Example

Hello Friends,

Today our leading topic is Laravel 9 Vue 3 Pagination with Vite Example. This article goes in detailed on Simple Vue.js Pagination Example with Laravel. We will look at example of how to create pagination in laravel 9 using vue js. I would like to show you Laravel 9 Pagination By Using Vue 3 Example.

You can use this example with laravel 6, laravel 7, laravel 8 and laravel 9 version.

In this tutorial, we will use laravel breeze, inertia js, vite, and tailwind CSS to create react js pagination with laravel API. we will create "posts" table with title and body columns. then we will display records with pagination.

Follow bellow tutorial step of Laravel 9 Vue Inertia Pagination Integration Tutorial.

Step 1: Download Laravel


Let us begin the tutorial by installing a new laravel application. if you have already created the project, then skip following step.

composer create-project laravel/laravel example-app

Step 2: Create Auth with Breeze

Now, in this step, we need to use composer command to install breeze, so let's run bellow command and install bellow library.

composer require laravel/breeze --dev

now, we need to create authentication using the below command. you can create basic login, register and email verification using vue js. if you want to create team management then you have to pass the addition parameter. you can see the below commands:

php artisan breeze:install vue

Now, let's node js package:

npm install

let's run vite, you have to keep start this command:

npm run dev

now, we need to run migration command to create database table:

php artisan migrate

Step 3: Create Migration and Model

Here, we need create database migration for Posts table and also we will create model for files table.

php artisan make:migration create_posts_table

Migration:

<?php

use Illuminate\Database\Migrations\Migration;

use Illuminate\Database\Schema\Blueprint;

use Illuminate\Support\Facades\Schema;

return new class extends Migration

{

/**

* Run the migrations.

*

* @return void

*/

public function up()

{

Schema::create('posts', function (Blueprint $table) {

$table->id();

$table->string('title');

$table->text('body');

$table->timestamps();

});

}

/**

* Reverse the migrations.

*

* @return void

*/

public function down()

{

Schema::dropIfExists('posts');

}

}

php artisan migrate

now we will create Post.php model by using following command:

php artisan make:model Post

App/Models/Post.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;

use Illuminate\Database\Eloquent\Model;

class Post extends Model

{

use HasFactory;

/**

* The attributes that are mass assignable.

*

* @var array

*/

protected $fillable = [

'title', 'body'

];

}

Step 4: Create Route

In third step, we will create routes for vue js image upload example. so create get and post routes here.

routes/web.php

<?php

use Illuminate\Foundation\Application;

use Illuminate\Support\Facades\Route;

use Inertia\Inertia;

use App\Http\Controllers\PostController;

/*

|--------------------------------------------------------------------------

| Web Routes

|--------------------------------------------------------------------------

|

| Here is where you can register web routes for your application. These

| routes are loaded by the RouteServiceProvider within a group which

| contains the "web" middleware group. Now create something great!

|

*/

Route::get('posts', [PostController::class, 'index'])->name('index');

Route::get('/', function () {

return Inertia::render('Welcome', [

'canLogin' => Route::has('login'),

'canRegister' => Route::has('register'),

'laravelVersion' => Application::VERSION,

'phpVersion' => PHP_VERSION,

]);

});

Route::get('/dashboard', function () {

return Inertia::render('Dashboard');

})->middleware(['auth', 'verified'])->name('dashboard');

require __DIR__.'/auth.php';

Step 5: Create Controller

In this step, we will create PostController file and add following code on it.

app/Http/Controllers/PostController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use Inertia\Inertia;

use App\Models\Post;

use Illuminate\Support\Facades\Validator;

class PostController extends Controller

{

/**

* Show the form for creating a new resource.

*

* @return Response

*/

public function index()

{

$posts = Post::latest()

->paginate(5);

return Inertia::render('Posts/Index', ['posts' => $posts]);

}

}

Step 6: Create vue Pages

Here, in this step we will create vue js file for Index.vue

so, let's create it and add bellow code on it.

resources/js/Pages/Posts/Index.vue

<script setup>

import BreezeAuthenticatedLayout from '@/Layouts/Authenticated.vue';

import { Head, Link, useForm } from '@inertiajs/inertia-vue3';

import Pagination from '@/Components/Pagination.vue'

defineProps({

posts: Object,

});

</script>

<template>

<Head title="Dashboard" />

<BreezeAuthenticatedLayout>

<template #header>

<h2 class="font-semibold text-xl text-gray-800 leading-tight">

Laravel 9 Vue 3 Pagination Example with Vite - NiceSnippets.com

</h2>

</template>

<div class="py-12">

<div class="max-w-7xl mx-auto sm:px-6 lg:px-8">

<div class="bg-white overflow-hidden shadow-sm sm:rounded-lg">

<div class="p-6 bg-white border-b border-gray-200">

<table className="table-fixed w-full">

<thead>

<tr className="bg-gray-100">

<th className="px-4 py-2 w-20">No.</th>

<th className="px-4 py-2">Title</th>

<th className="px-4 py-2">Body</th>

</tr>

</thead>

<tbody>

<tr v-for="post in posts.data">

<td className="border px-4 py-2">{{ post.id }}</td>

<td className="border px-4 py-2">{{ post.title }}</td>

<td className="border px-4 py-2">{{ post.body }}</td>

</tr>

</tbody>

</table>

<Pagination class="mt-6" :links="posts.links" />

</div>

</div>

</div>

</div>

</BreezeAuthenticatedLayout>

</template>

resources/js/Components/Pagination.vue

.vue looks like:

<template>

<div v-if="links.length > 3">

<div class="flex flex-wrap mt-8">

<template v-for="(link, key) in links" :key="key">

<div

v-if="link.url === null"

class="mr-1 mb-1 px-4 py-3 text-sm leading-4 text-gray-400 border rounded"

v-html="link.label"

/>

<Link

v-else

class="mr-1 mb-1 px-4 py-3 text-sm leading-4 border rounded hover:bg-white focus:border-primary focus:text-primary"

:class="{ 'bg-blue-700 text-white': link.active }"

:href="link.url"

v-html="link.label"

/>

</template>

</div>

</div>

</template>

<script>

import { defineComponent } from "vue";

import { Link } from "@inertiajs/inertia-vue3";

export default defineComponent({

components: {

Link,

},

props: {

links: Array,

},

});

</script>

Run Laravel App:

All the required steps have been done, now you have to type the given below command and hit enter to run the Laravel app:

php artisan serve

Also keep run following command for vite:

npm run dev

If you want to build then you can run following command:

npm run build

Now, Go to your web browser, type the given URL and view the app output:

http://localhost:8000/login

now it works...

I hope it can help you...