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

React组件中点击下载按钮却在页面刷新时自动触发下载的问题

问题原因与解决方案

核心问题

你在DocumentDownloadButton组件的onClick属性里直接调用了downloadDocument(docId, fileName),这会导致组件渲染(页面刷新)时立即执行该函数,而不是等待点击事件触发。React的事件回调需要传递函数引用,而非函数执行的结果。

修复方法

方法1:用箭头函数包裹回调

直接在onClick里用箭头函数包裹下载调用,确保只有点击时才执行:

return (
  <>
    <DownloadIconContainer onClick={() => downloadDocument(docId, fileName)}>
      <DownloadIconSmall />
    </DownloadIconContainer>
  </>
)

方法2:改造下载函数为返回函数的形式

如果想避免每次渲染创建新箭头函数,可以把downloadDocument改成返回函数的结构:

const downloadDocument = (id, file) => () => {
  apiFor('someApi')
    .get(`/documents/${id}`, { responseType: 'blob' }, {
      headers: {
        Accept: 'application/octet-stream' // 修正拼写错误:applicaton → application
      } })
    .then((response) => {
      const contentType = response.headers['content-type'] || 'application/octet-stream'
      const blob = new Blob([response.data], { type: contentType })
      return FileSaver.saveAs(blob, file)
    })
    .catch((error) => {
      console.error(error)
    })
}

// 使用时直接传递函数引用
return (
  <>
    <DownloadIconContainer onClick={downloadDocument(docId, fileName)}>
      <DownloadIconSmall />
    </DownloadIconContainer>
  </>
)

额外注意点

请求头里Accept字段存在拼写错误:applicaton应改为application,否则可能导致服务器返回的内容类型不符合预期,影响下载功能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 11:05:22