TALL栈(Laravel7)+Turbolinks下Livewire分页搜索失效问题求助
解决方案
按优先级依次排查修复:
- 修复组件视图单根节点问题
Livewire要求每个组件的视图必须有且仅有一个根DOM节点,多根节点会导致JS挂载失败,所有wire:指令失效,且无控制台报错,与描述现象完全匹配。将组件视图所有内容包裹在一个父级div内:
<div> <input wire:model.debounce.500ms="search" type="search" name="search" id="search"> <table> @forelse($products as $product) <tr onclick="Turbolinks.visit('{{ route('product', $product->id) }}')"> <td>{{ $product->name }}</td> ... </tr> @empty <tr><td>Nothing to show for {{ $search }}</td></tr> @endforelse </table> {{ $products->links() }} </div>
- 配置Turbolinks兼容
确保Livewire能在Turbolinks跳转后正常初始化:
- 若通过CDN引入Livewire,在
@livewireScripts前添加配置:
<script>window.livewire_turbolinks = true;</script> @livewireScripts
- 若通过NPM引入Livewire,在
app.js中调整初始化逻辑:
import Livewire from 'livewire'; document.addEventListener('turbolinks:load', () => { Livewire.start(); });
同时保证@livewireScripts放置在页面</body>标签之前,不要放在<head>节点内。
- 优化Market参数调用逻辑
不要直接在render()方法中调用request('market'),将Market声明为组件公共属性,在mount()阶段完成赋值,避免序列化异常和重复取值:
class ProductsTable extends Component{ use WithPagination; public $search = ''; public $market; protected $queryString = [ 'search' => ['except' => ''], 'page' => ['except' => 1], ]; public function mount() { $this->market = request('market'); } public function render(){ $products = Product::where('market_id', $this->market->id) ->when($this->search !== '', function($query) { $query->where('name', 'like', "%{$this->search}%"); $query->orWhere('brand', 'like', "%{$this->search}%"); })->paginate(15); return view('livewire.products-table', ['products' => $products]); } }
- 替换为Livewire适配的分页视图
Laravel默认分页视图是普通跳转链接,会触发Turbolinks刷新,替换为Livewire自带的分页视图,自动生成带wire:click的交互按钮:
{{ $products->links('livewire::pagination-links') }}
也可在组件内全局指定分页主题:
// 组件内添加对应配置 protected $paginationTheme = 'tailwind'; // 使用bootstrap则改为bootstrap
内容的提问来源于stack exchange,提问作者Diego
相关产品推荐
相关产品推荐

