Livewire执行操作时flash消息仅显示一次 如何让其每次操作都正常弹出?
问题根因
- 你当前的弹窗触发逻辑仅在页面首次渲染/整体刷新时执行:代码里判断session闪存的JS片段只会在Blade模板第一次渲染到浏览器时运行一次,你做删除操作是无刷新的异步请求(大概率是Livewire组件或普通AJAX调用),后续删除成功后页面没有重载,这段JS不会重新执行,哪怕session里写入了新的flash消息也不会触发弹窗。
- 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
相关产品推荐
相关产品推荐

