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

Ant Design <Upload>组件调用setState时为何会取消上传请求?

踩坑记录:Ant Design Upload组件上传请求中断的解决办法

最近用Ant Design做表单的时候遇到个头疼的问题,折腾了好久才搞定,来跟大家分享下:

  • 我用Ant Design搭建了一个包含Upload组件的表单
  • 结果每次上传图片,请求都会莫名其妙中断
  • 排查后发现,是onChange回调里调用setState()导致请求中止了
  • 代码还是直接抄的Ant Design官网的头像上传示例,没想到会出问题
  • 卡在这浪费了超多时间……

下面是我当时的代码:

import React from 'react';
import ReactDOM from 'react-dom';
import { Upload, Form, Icon } from 'antd';

function getBase64(img, callback) {
  const reader = new FileReader();
  reader.addEventListener('load', () => callback(reader.result));
  reader.readAsDataURL(img);
}

class AddBookForm extends React.Component {
  state = {
    loading: false,
  };

  handleChange = (info) => {
    if (info.file.status === 'uploading') {
      this.setState({ loading: true });
      return;
    }
    if (info.file.status === 'done') {
      // 实际项目中应该从接口响应里获取图片地址
      getBase64(info.file.originFileObj, imageUrl => this.setState({
        imageUrl,
        loading: false,
      }));
    }
  }

  render() {
    const formItemLayout = {
      labelCol: { xs: 24, sm: 2 },
      wrapperCol: { xs: 24, sm: 8 }
    };
    // 这里原本用了无状态函数组件定义FormItem
    const FormItem = function(props) {
      return <Form.Item {...formItemLayout} {...props}></Form.Item>;
    };

    const uploadButton = (
      <div>
        <Icon type={this.state.loading ? 'loading' : 'plus'} />
        <div className="ant-upload-text">Upload</div>
      </div>
    );

    const imageUrl = this.state.imageUrl;
    return (
      <Form layout="horizontal">
        <FormItem label="图片" extra="请上传2M以内的JPG图片">
          <Upload
            name='imageFile'
            action="/api/image-upload"
            onChange={this.handleChange}
            showUploadList={false}
            listType="picture-card"
            className="single-image-uploader"
          >
            {imageUrl ? <img src={imageUrl} alt="" /> : uploadButton}
          </Upload>
        </FormItem>
      </Form>
    );
  }
}

ReactDOM.render((
  <AddBookForm />
), document.getElementById('root'));

2018-05-25 更新:问题解决!

把原本定义的无状态函数组件FormItem改成类组件之后,上传中断的问题就完全消失了。修改后的FormItem代码如下:

class FormItem extends React.Component {
  render() {
    const formItemLayout = {
      labelCol: { xs: 24, sm: 2 },
      wrapperCol: { xs: 24, sm: 8 }
    };
    return <Form.Item {...formItemLayout} {...this.props}></Form.Item>
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:13:35