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

Livewire执行操作时flash消息仅显示一次 如何让其每次操作都正常弹出?

问题根因

  1. 你当前的弹窗触发逻辑仅在页面首次渲染/整体刷新时执行:代码里判断session闪存的JS片段只会在Blade模板第一次渲染到浏览器时运行一次,你做删除操作是无刷新的异步请求(大概率是Livewire组件或普通AJAX调用),后续删除成功后页面没有重载,这段JS不会重新执行,哪怕session里写入了新的flash消息也不会触发弹窗。
  2. Laravel的session闪存默认仅在下一个HTTP请求生命周期有效,无刷新异步请求场景下闪存消息容易出现未正确消费、重复消费或者失效的问题。

最优解决方案(适配Livewire组件场景,你提供的删除方法属于Livewire组件写法)

不要依赖session闪存触发弹窗,改用Livewire事件机制推送消息到前端触发弹窗,稳定性更高:

第一步 修改组件删除方法

删除原有session闪存逻辑,改成派发浏览器事件:

public function delete($id)
{
    $categoriesService = CategoriesService::deleteCategory($id);

    if(!$categoriesService)
    {
        $this->dispatch('show-alert', type: 'error', message: '删除分类失败');
        return;
    }

    $this->dispatch('show-alert', type: 'success', message: '分类删除成功!');
}

第二步 修改Blade模板代码

删掉原有判断session的JS片段,新增全局事件监听代码:

<script>
document.addEventListener('livewire:init', () => {
    Livewire.on('show-alert', (event) => {
        Swal.fire(
            event.type === 'success' ? '操作成功' : '操作失败',
            event.message,
            event.type
        )
    })
})
</script>

普通AJAX删除场景解决方案

如果你的删除是原生AJAX实现,直接在后端将操作状态和消息返回给前端,在AJAX的成功回调里触发弹窗即可,不需要经过session闪存中转。

内容的提问来源于stack exchange,提问作者Freya Ly

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 02:54:03