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

React中ANTD Upload.Dragger组件onChange事件触发两次问题求助

问题根因

Ant Design 的 Upload 及 Dragger 组件的 onChange 回调设计为文件上传状态每次变更时都会触发:

  • 第一次触发:文件被选中/拖拽进入上传队列,状态变为 uploading
  • 第二次触发:上传请求执行完成,状态变为 done(成功)或 error(失败)
    你当前的代码未对文件状态做过滤,每次触发回调都会执行上传逻辑,因此出现重复触发的问题。

修复方案

方案1: onChange 增加状态过滤

仅在文件进入上传队列的 uploading 状态时执行一次上传逻辑:

const onFileChanged = async image => {
  // 非上传中状态直接跳过,避免重复执行
  if (image.file.status !== 'uploading') return
  if (isDenied(image?.type)) {
    return onNotifyDenied()
  }
  await dispatch(uploadAttachment(image.file))
}

方案2:上传逻辑迁移到 customRequest (更推荐)

你已经配置了 customRequest 自定义上传方法,上传逻辑本就应该放在此处,onChange 仅用来处理状态提示、表单值同步即可,从根源避免重复触发:

// customRequest 绑定的方法内处理上传逻辑
const onSuccess = async (options) => {
  const { file, onSuccess, onError } = options
  if (isDenied(file.type)) {
    onNotifyDenied()
    onError(new Error('文件类型不合法'))
    return
  }
  try {
    await dispatch(uploadAttachment(file))
    onSuccess('上传完成')
  } catch (err) {
    onError(err)
  }
}

// onChange 仅处理状态反馈即可
const onFileChanged = (image) => {
  if (image.file.status === 'done') {
    message.success('主图上传成功')
  } else if (image.file.status === 'error') {
    message.error('主图上传失败')
  }
}

其他排查项

如果修改后仍有重复触发,可以检查两个场景:

  • 若你使用 React 18 严格模式,开发环境下组件会重复挂载一次导致回调多触发一次,该问题在生产环境会自动消失
  • 确认 maxCount={1} 配置生效,不存在多文件被同时加入上传队列的情况

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 13:06:08