react antd的form表单与upload一起使用时,label点击会触发上传事件

问题

antd的form表单与upload一起使用时,应该是点击上传按钮才会触发上传事件,但是实际上是点击label也会触发

代码如下:

jsx 复制代码
 <Form layout={"vertical"}>
      <Form.Item label={证件照}>
          {getFieldDecorator("attachments", {
              rules: [{ required: true, message: "请上传证件照" }],
                })(
                  <Upload
                    customRequest={() => { }}
                    fileList={fileList}
                    accept=".jpg, .jpeg, .png, .PNG, .JPG, .JPEG"
                    beforeUpload={(file) => this.beforeUpload(file)}
                    onChange={(file) => this.handleFileUploadChange(file)}
                    onRemove={(file) => this.handleFileUploadRemove(file)}
                  >
                    <Button disabled={fileList.length ? true : false}>
                      <Icon type="upload" />
                      点击上传
                    </Button>
                 </Upload>
           )}
      </Form.Item>
</Form>

原因:

在React Ant Design中,当使用Form组件和Upload组件时,点击label标签会触发上传事件的原因是,Upload组件内部使用了一个隐藏的input元素来处理文件选择。而label标签的for属性与input元素的id属性相对应,当点击label标签时,会触发对应id的input元素的点击事件,从而触发上传事件。

解决方法:

方法一

可以通过给label标签添加htmlFor属性,将其与对应的input元素的id属性进行绑定,从而避免点击label标签触发上传事件。

jsx 复制代码
 <Form layout={"vertical"}>
      <Form.Item htmlFor="upload-item" label={证件照}>
          {getFieldDecorator("attachments", {
              rules: [{ required: true, message: "请上传证件照" }],
                })(
                  <Upload
                    customRequest={() => { }}
                    fileList={fileList}
                    accept=".jpg, .jpeg, .png, .PNG, .JPG, .JPEG"
                    beforeUpload={(file) => this.beforeUpload(file)}
                    onChange={(file) => this.handleFileUploadChange(file)}
                    onRemove={(file) => this.handleFileUploadRemove(file)}
                  >
                    <Button disabled={fileList.length ? true : false}>
                      <Icon type="upload" />
                      点击上传
                    </Button>
                 </Upload>
           )}
      </Form.Item>
</Form>

方法二

再套一层<Form.Item>

jsx 复制代码
 <Form layout={"vertical"}>
      <Form.Item label={证件照}>
          <Form.Item>
              {getFieldDecorator("attachments", {
                  rules: [{ required: true, message: "请上传证件照" }],
                    })(
                      <Upload
                        customRequest={() => { }}
                        fileList={fileList}
                        accept=".jpg, .jpeg, .png, .PNG, .JPG, .JPEG"
                        beforeUpload={(file) => this.beforeUpload(file)}
                        onChange={(file) => this.handleFileUploadChange(file)}
                        onRemove={(file) => this.handleFileUploadRemove(file)}
                      >
                        <Button disabled={fileList.length ? true : false}>
                          <Icon type="upload" />
                          点击上传
                        </Button>
                     </Upload>
               )}
           </Form.Item>
      </Form.Item>
</Form>
相关推荐
Bacon9 小时前
前端:从0-1实现一个脚手架
前端
Bacon9 小时前
前端项目部署实战 nginx+docker持续集成
前端
beckyye9 小时前
阿里云智能语音简单使用:语音识别
前端·语音识别·录音
东东23310 小时前
前端规范工具之husky与lint-staged
前端·javascript·eslint
jump68010 小时前
手写事件总线、事件总线可能带来的内存泄露问题
前端
岁月宁静10 小时前
在 Vue 3.5 中优雅地集成 wangEditor,并定制“AI 工具”下拉菜单(总结/润色/翻译)
前端·javascript·vue.js
执沐10 小时前
基于HTML 使用星辰拼出爱心,并附带闪烁+流星+点击生成流星
前端·html
#做一个清醒的人10 小时前
【electron6】Web Audio + AudioWorklet PCM 实时采集噪音和模拟调试
前端·javascript·electron·pcm
拉不动的猪11 小时前
图文引用打包时的常见情景解析
前端·javascript·后端
浩男孩11 小时前
🍀继分页器组件后,封装了个抽屉组件
前端