Laravel Livewire 分页按钮显示异常问题求助
解决Livewire分页显示异常问题
问题梳理
- 使用
pagination()时完全不显示分页组件 - 使用
simplePagination()时样式错乱 - 技术栈:Laravel 11、Livewire 3、Tailwind CSS 3 + Flowbite
分步修复方案
1. 替换Bootstrap类为Tailwind对应样式
你的视图中使用了Bootstrap类(d-flex, justify-content-between, form-control),但当前技术栈为Tailwind,这类样式无法生效,直接替换为Tailwind类:
<div class="flex justify-between items-center my-4"> <div> <label for="perPage">Tampilkan</label> <select name="perPage" id="perPage" class="block w-full rounded-md border-gray-300 shadow-sm focus:border-primary-500 focus:ring-primary-500 dark:bg-gray-700 dark:text-white" wire:model.live="perPage"> @foreach ($perPageOptions as $page) <option value="{{ $page }}">{{ $page }}</option> @endforeach </select> </div> <div> {{ $users->links() }} </div> </div>
2. 完善Livewire组件分页参数
组件中缺少$perPage和$perPageOptions定义,会导致下拉框功能异常甚至影响分页渲染,补充到组件类:
<?php namespace App\Livewire\Users; use App\Models\User; use Livewire\Component; use Livewire\WithPagination; class Index extends Component { use WithPagination; public $perPage = 2; public $perPageOptions = [2, 5, 10, 20]; public function render() { return view('livewire.users.index', [ 'users' => User::with(['sections','role'])->simplePaginate($this->perPage) ]); } }
3. 让Tailwind扫描Livewire分页视图
修改Tailwind配置,将Livewire视图路径加入content数组,确保分页组件样式能被正确编译:
/** @type {import('tailwindcss').Config} */ export default { content: [ "./resources/**/*.blade.php", "./resources/**/*.js", "./resources/**/*.vue", "./node_modules/flowbite/**/*.js", "./vendor/livewire/livewire/src/**/*.blade.php", "./storage/framework/views/*.php", ], darkMode: "class", theme: { extend: { colors: { primary: { 50: "#eff6ff", 100: "#dbeafe", 200: "#bfdbfe", 300: "#93c5fd", 400: "#60a5fa", 500: "#3b82f6", 600: "#2563eb", 700: "#1d4ed8", 800: "#1e40af", 900: "#1e3a8a", 950: "#172554", }, }, }, fontFamily: { body: [ "Inter", "ui-sans-serif", "system-ui", "-apple-system", "system-ui", "Segoe UI", "Roboto", "Helvetica Neue", "Arial", "Noto Sans", "sans-serif", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji", ], sans: [ "Inter", "ui-sans-serif", "system-ui", "-apple-system", "system-ui", "Segoe UI", "Roboto", "Helvetica Neue", "Arial", "Noto Sans", "sans-serif", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji", ], }, }, plugins: [require("flowbite/plugin")], };
4. 适配Flowbite分页样式(可选)
若想让分页完全匹配Flowbite风格,可自定义Livewire分页视图:
- 发布Livewire分页视图:
php artisan vendor:publish --tag=livewire-pagination
- 替换
resources/views/vendor/livewire/tailwind.blade.php内容为Flowbite分页结构:
<nav class="flex items-center justify-between pt-4" aria-label="Pagination"> <div class="flex justify-between flex-1 sm:hidden"> @if ($paginator->onFirstPage()) <span class="relative inline-flex items-center px-4 py-2 text-sm font-medium text-gray-500 bg-white border border-gray-300 cursor-default rounded-md dark:bg-gray-800 dark:border-gray-700 dark:text-gray-400"> 上一页 </span> @else <button wire:click="previousPage" wire:loading.attr="disabled" class="relative inline-flex items-center px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 dark:bg-gray-800 dark:border-gray-700 dark:text-white dark:hover:bg-gray-700"> 上一页 </button> @endif @if ($paginator->hasMorePages()) <button wire:click="nextPage" wire:loading.attr="disabled" class="relative inline-flex items-center px-4 py-2 ml-3 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 dark:bg-gray-800 dark:border-gray-700 dark:text-white dark:hover:bg-gray-700"> 下一页 </button> @else <span class="relative inline-flex items-center px-4 py-2 ml-3 text-sm font-medium text-gray-500 bg-white border border-gray-300 cursor-default rounded-md dark:bg-gray-800 dark:border-gray-700 dark:text-gray-400"> 下一页 </span> @endif </div> <div class="hidden sm:flex-1 sm:flex sm:items-center sm:justify-between"> <div> <p class="text-sm text-gray-700 dark:text-gray-300"> 显示第 <span class="font-medium">{{ $paginator->firstItem() }}</span> 到 <span class="font-medium">{{ $paginator->lastItem() }}</span> 条,共 <span class="font-medium">{{ $paginator->total() }}</span> 条记录 </p> </div> <div> <span class="relative z-0 inline-flex rounded-md shadow-sm -space-x-px"> @if ($paginator->onFirstPage()) <span class="relative inline-flex items-center px-2 py-2 rounded-l-md border border-gray-300 bg-white text-sm font-medium text-gray-500 cursor-default dark:bg-gray-800 dark:border-gray-700 dark:text-gray-400"> <svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20"> <path fill-rule="evenodd" d="M12.707 5.293a1 1 0 010 1.414L9.414 10l3.293 3.293a1 1 0 01-1.414 1.414l-4-4a1 1 0 010-1.414l4-4a1 1 0 011.414 0z" clip-rule="evenodd"></path> </svg> </span> @else <button wire:click="previousPage" wire:loading.attr="disabled" class="relative inline-flex items-center px-2 py-2 rounded-l-md border border-gray-300 bg-white text-sm font-medium text-gray-500 hover:bg-gray-50 focus:z-10 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:border-indigo-500 dark:bg-gray-800 dark:border-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-white"> <svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20"> <path fill-rule="evenodd" d="M12.707 5.293a1 1 0 010 1.414L9.414 10l3.293 3.293a1 1 0 01-1.414 1.414l-4-4a1 1 0 010-1.414l4-4a1 1 0 011.414 0z" clip-rule="evenodd"></path> </svg> </button> @endif @foreach ($elements as $element) @if (is_string($element)) <span aria-disabled="true"> <span class="relative inline-flex items-center px-4 py-2 border border-gray-300 bg-white text-sm font-medium text-gray-700 cursor-default dark:bg-gray-800 dark:border-gray-700 dark:text-gray-400">{{ $element }}</span> </span> @endif @if (is_array($element)) @foreach ($element as $page => $url) @if ($page == $paginator->currentPage()) <span aria-current="page"> <span class="relative inline-flex items-center px-4 py-2 border border-indigo-500 bg-indigo-50 text-sm font-medium text-indigo-600 dark:bg-gray-700 dark:border-gray-700 dark:text-white">{{ $page }}</span> </span> @else <button wire:click="gotoPage({{ $page }})" class="relative inline-flex items-center px-4 py-2 border border-gray-300 bg-white text-sm font-medium text-gray-700 hover:bg-gray-50 focus:z-10 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:border-indigo-500 dark:bg-gray-800 dark:border-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-white">{{ $page }}</button> @endif @endforeach @endif @endforeach @if ($paginator->hasMorePages()) <button wire:click="nextPage" wire:loading.attr="disabled" class="relative inline-flex items-center px-2 py-2 rounded-r-md border border-gray-300 bg-white text-sm font-medium text-gray-500 hover:bg-gray-50 focus:z-10 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:border-indigo-500 dark:bg-gray-800 dark:border-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-white"> <svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20"> <path fill-rule="evenodd" d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z" clip-rule="evenodd"></path> </svg> </button> @else <span class="relative inline-flex items-center px-2 py-2 rounded-r-md border border-gray-300 bg-white text-sm font-medium text-gray-500 cursor-default dark:bg-gray-800 dark:border-gray-700 dark:text-gray-400"> <svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20"> <path fill-rule="evenodd" d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z" clip-rule="evenodd"></path> </svg> </span> @endif </span> </div> </div> </nav>
5. 重新编译资源
修改配置后执行编译命令,确保样式生效:
npm run build
完成以上步骤后,重新访问页面,pagination()和simplePagination()即可正常显示且样式符合Tailwind/Flowbite规范。
内容的提问来源于stack exchange,提问作者owf
相关产品推荐
相关产品推荐

