You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 09:42:34