Filament(v2) Action能否响应式?如何刷新页面或更新导航徽章?
解决方案:实现Action触发后导航徽章实时更新
针对你的需求,提供两种可行方案,从快速实现到优雅优化:
方案一:整页刷新(快速落地)
直接在添加食谱的Single Action中,执行完业务逻辑后跳转回当前页面,实现整页刷新效果。
代码实现
在你的RecipesResource的getActions()方法中修改Action:
use Filament\Actions\Action; use Filament\Notifications\Notification; Action::make('addToMenu') ->action(function (Recipe $record) { // 写入添加食谱到Menu的业务逻辑,示例: $record->menu()->attach(auth()->user()->currentMenu); }) ->successRedirectUrl(request()->url()) // 执行成功后跳回当前页面 ->successNotification( Notification::make() ->title('食谱已添加至菜单') ->success() );
如果不想跳转页面,也可以通过Livewire事件触发前端自动刷新:
Action::make('addToMenu') ->action(function (Recipe $record) { // 添加食谱到Menu的逻辑 }) ->after(function () { $this->dispatch('trigger-page-refresh'); });
然后在Filament的全局布局文件(如resources/views/vendor/filament/layouts/app.blade.php)中添加监听:
<script> document.addEventListener('livewire:initialized', () => { Livewire.on('trigger-page-refresh', () => window.location.reload()); }); </script>
方案二:局部更新导航徽章(优雅无刷新)
无需整页刷新,仅更新导航栏的徽章数字,提升用户体验。
步骤1:在Action中触发更新事件
修改RecipesResource中的Single Action,执行成功后发送全局Livewire事件:
Action::make('addToMenu') ->action(function (Recipe $record) { // 添加食谱到Menu的业务逻辑 $record->menu()->attach(auth()->user()->currentMenu); }) ->after(function () { // 发送全局事件通知菜单数量更新 $this->dispatch('menu-recipe-count-updated', to: '*'); });
步骤2:添加API接口获取最新数量
在routes/api.php中新增路由,用于实时获取菜单内的食谱数量:
use App\Models\Recipe; use Illuminate\Support\Facades\Route; Route::get('/menu-recipe-count', function () { // 根据你的业务逻辑计算数量,示例为当前用户菜单的食谱数 $count = Recipe::whereBelongsTo(auth()->user()->currentMenu)->count(); return response()->json(['count' => $count]); })->middleware(['auth', 'verified']);
步骤3:监听事件并更新徽章
在Filament全局布局文件中添加JavaScript,监听事件并更新徽章内容:
<script> document.addEventListener('livewire:initialized', async () => { Livewire.on('menu-recipe-count-updated', async () => { // 请求最新数量 const response = await fetch('/api/menu-recipe-count'); const data = await response.json(); // 找到Menu导航项的徽章元素并更新 const badgeElement = document.querySelector('nav [href*="/menu"] .fi-nav-badge'); if (badgeElement) { badgeElement.textContent = data.count; } }); }); </script>
内容的提问来源于stack exchange,提问作者Brendan White
相关产品推荐
相关产品推荐

