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
相关产品推荐
相关产品推荐

