Laravel Vue Inertia 删除操作为何弹出“1”?
数据阿明
结论
从给出的代码看,confirm("Are you sure you want to delete this record?") 返回布尔值 true 或 false,不会把确认结果显示成“1”。控制器删除记录后会重定向并设置成功提示,也没有直接返回数字。仅凭这两段代码,无法确定“1”弹窗是从哪里来的。需要先确认它是浏览器原生弹窗,还是页面中的自定义模态框。
当前删除入口使用了 <Link href="#">。删除操作不需要链接跳转,改成按钮可以避免 href="#" 带来的额外页面行为。
调整 Vue 删除入口
可以使用 Inertia 的 router.delete(),并将按钮的 type 设为 "button":
<script setup>
import { router } from "@inertiajs/vue3";
function destroy(id) {
if (!window.confirm("Are you sure you want to delete this record?")) {
return;
}
router.delete(route("article_categories.destroy", { id }), {
preserveScroll: true,
onSuccess: () => {
// 删除成功后由页面显示服务端传回的提示
},
onError: (errors) => {
console.error("删除请求失败:", errors);
},
});
}
</script>
<template>
<tbody>
<tr
v-for="articleCategory in articleCategories.data"
:key="articleCategory.id"
>
<td>{{ articleCategory.title }}</td>
<td>
<div class="flex gap-2 justify-end">
<TableEditButton
:href="route('article_categories.edit', articleCategory.id)"
/>
<button
type="button"
@click="destroy(articleCategory.id)"
>
Delete
</button>
</div>
</td>
</tr>
</tbody>
</template>
如果继续使用 useForm(),也可以保留 form.delete()。把触发删除的 <Link href="#"> 换成按钮,并检查是否有其他代码把删除结果或确认值传给模态框。
检查“1”的来源
- 先看弹窗的样式和内容。如果是浏览器原生
confirm(),会显示确认提示以及浏览器提供的确认、取消按钮。confirm()的返回值只会交给 JavaScript 代码,不会自动显示在弹窗里。 - 在项目中搜索
confirm(、alert(、模态框组件,以及页面中显示变量值的代码,检查是否有其他位置把1设为弹窗内容。 - 在浏览器开发者工具的 Network 面板中查看删除请求的响应。如果响应正文是
1,再检查对应控制器或中间件是否返回了布尔删除结果。Laravel 的模型delete()返回布尔值,但给出的控制器没有把这个返回值作为 HTTP 响应返回。 - 检查成功提示的显示逻辑。控制器设置了
messageflash 值,前端还需要通过应用已有的 Inertia 共享数据或页面 props 读取并展示它;否则提示不会自动显示成弹窗。
控制器
当前控制器会查找记录、删除记录,然后重定向并设置提示:
public function destroy($id)
{
$articleCategory = ArticleCategory::findOrFail($id);
$articleCategory->delete();
return redirect()
->route('article_categories')
->with('message', 'Article category deleted successfully.');
}
请核对 article_categories 是否是实际存在的路由名称,并确认前端读取的是同一个 message flash 键。如果弹窗仍显示“1”,需要结合弹窗来源和 Network 响应继续判断。现有代码片段不足以确定是哪段代码产生了这个数字。
备注:内容仅供参考。
