React点击onClick下载带查询参数CSV,参数错误时弹窗提示实现问题
解决方案
原有window.open的实现逻辑无法提前检测接口返回状态,只要调用就会新开标签页,因此会暴露错误JSON内容。我们可以通过「先预请求校验结果、再触发下载」的逻辑优化,修改后的代码如下:
const doSubmit = async () => { try { const timeZoneoffset = new Date().getTimezoneOffset(); const reqUrl = `${apiEndpoint}/export-device-data?fromDate=${fromDateTime}&toDate=${toDateTime}&userId=${values.userId}&deviceTypeId=${deviceId}&timeZoneoffset=${timeZoneoffset}`; // 先发起请求校验返回结果 const res = await fetch(reqUrl); // 判断是否为错误响应:状态码异常 或者 返回内容是JSON(错误场景) if (!res.ok || res.headers.get('content-type')?.includes('application/json')) { const errInfo = await res.json(); // 这里可以替换为你项目内的消息提示组件,比如antd的message.error alert(errInfo.message || '下载请求异常,请检查参数后重试'); return; } // 响应正常,触发下载 const blob = await res.blob(); const downloadUrl = window.URL.createObjectURL(blob); const aLink = document.createElement('a'); aLink.style.display = 'none'; aLink.href = downloadUrl; // 自定义下载的文件名 aLink.download = `设备数据导出_${new Date().getTime()}.csv`; document.body.appendChild(aLink); aLink.click(); document.body.removeChild(aLink); // 释放临时URL内存 window.URL.revokeObjectURL(downloadUrl); } catch (e) { alert('下载失败,请稍后重试'); } };
注意事项
- 该方案需要后端配合配置导出接口的CORS跨域规则,允许你的前端域名发起请求
- 如果你的项目使用axios等请求库,逻辑完全一致,只需要在请求时配置返回类型为blob,再判断返回内容类型即可
内容的提问来源于stack exchange,提问作者Rabindra Kumar Mahato
相关产品推荐
相关产品推荐

