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

Laravel 11中使用Axios删除数据后,如何在JS中实现跳转与错误处理

问题场景

我通过Axios和Laravel后端控制器交互,当前代码实现如下:

后端代码(RoleController.php)

public function delete($id): string
{
    $data = [
        'id' => $id
    ];

    return response()->json($data, 200);
}

前端代码(app.js)

form.addEventListener('submit', event => {
    event.preventDefault();
    console.log(url);

    axios.delete(url, {
        data: {
            id: id,
        },
    }).then(response => {
        if (response.status === 200) {
            let data = response.data;
            console.log(data);  // <- 如何在此处实现跳转?
        }
    }).catch(error => {
        console.log(error.message);
    });
});

原本在Laravel控制器里,我可以直接用下面的代码实现页面跳转和错误提示:

return redirect()->route('roles.index')->with('error', __('Role deleted'));

// 或者抛出权限错误
abort(403, __('SUPER ADMIN ROLE CAN NOT BE DELETED'));

现在需要改成在前端JS接收响应后完成类似的跳转和错误提示操作,该怎么实现?


实现方案

1. 页面跳转(对应控制器的redirect逻辑)

在Axios的then回调里,直接通过window.location.href就能实现页面跳转。如果需要传递删除成功的提示信息,可以用localStorage临时存储或者URL参数:

方式1:带提示信息跳转

先修改后端控制器,返回跳转地址和提示内容:

public function delete($id): \Illuminate\Http\JsonResponse
{
    // 这里先执行你的角色删除逻辑
    
    return response()->json([
        'id' => $id,
        'redirect_url' => route('roles.index'), // Laravel生成跳转路由
        'message' => __('Role deleted')
    ], 200);
}

前端接收响应后,把提示存到localStorage,再跳转:

.then(response => {
    if (response.status === 200) {
        const { redirect_url, message } = response.data;
        // 临时存储提示信息
        localStorage.setItem('delete_success_msg', message);
        // 跳转到目标页面
        window.location.href = redirect_url;
    }
})

然后在跳转后的页面(比如角色列表页)添加JS代码,读取并显示提示:

// 页面加载时检查是否有提示
document.addEventListener('DOMContentLoaded', () => {
    const successMsg = localStorage.getItem('delete_success_msg');
    if (successMsg) {
        // 创建提示元素并插入页面(样式可以自己调整)
        const alertBox = document.createElement('div');
        alertBox.className = 'alert alert-success';
        alertBox.textContent = successMsg;
        document.querySelector('.container').prepend(alertBox);
        
        // 3秒后自动移除提示
        setTimeout(() => alertBox.remove(), 3000);
        // 清除localStorage里的内容
        localStorage.removeItem('delete_success_msg');
    }
});

方式2:直接跳转(无需提示)

如果不需要提示信息,直接在then里写跳转代码就行:

.then(response => {
    if (response.status === 200) {
        // 直接跳转到角色列表页,替换成你的实际地址
        window.location.href = '/roles';
        // 或者提前在页面定义好Laravel生成的路由变量
        // window.location.href = rolesIndexUrl;
    }
})

2. 错误处理(对应控制器的abort逻辑)

后端需要返回对应的HTTP状态码和错误信息,而不是直接abort:

public function delete($id): \Illuminate\Http\JsonResponse
{
    // 假设超级管理员角色ID是1,判断是否禁止删除
    if ($id == 1) {
        return response()->json([
            'message' => __('SUPER ADMIN ROLE CAN NOT BE DELETED')
        ], 403);
    }

    // 执行删除逻辑...
    
    return response()->json([
        'id' => $id,
        'redirect_url' => route('roles.index'),
        'message' => __('Role deleted')
    ], 200);
}

前端在Axios的catch回调里处理错误响应:

.catch(error => {
    if (error.response) {
        // 服务器返回了错误状态码
        if (error.response.status === 403) {
            const errorMsg = error.response.data.message;
            // 创建错误提示并显示
            const errorAlert = document.createElement('div');
            errorAlert.className = 'alert alert-danger';
            errorAlert.textContent = errorMsg;
            document.body.prepend(errorAlert);
            
            // 3秒后自动消失
            setTimeout(() => errorAlert.remove(), 3000);
        } else {
            console.error('请求出错:', error.response.data.message);
        }
    } else {
        console.error('网络异常:', error.message);
    }
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 02:05:23