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>
相关推荐
90后小陈老师2 分钟前
WebXR教学 07 项目5 贪吃蛇小游戏
前端·数码相机
一口一个橘子4 分钟前
[ctfshow web入门] web118
前端·web安全·网络安全
GanGuaGua20 分钟前
Vue3:脚手架
前端·javascript·css·vue.js·vue
鸡吃丸子1 小时前
常见的实时通信技术(轮询、sse、websocket、webhooks)
前端·websocket·状态模式
胡斌附体2 小时前
vue添加loading后修复页面渲染问题
前端·javascript·vue.js·渲染·v-if·异步加载
酷爱码3 小时前
css中的 vertical-align与line-height作用详解
前端·css
沐土Arvin3 小时前
深入理解 requestIdleCallback:浏览器空闲时段的性能优化利器
开发语言·前端·javascript·设计模式·html
专注VB编程开发20年3 小时前
VB.NET关于接口实现与简化设计的分析,封装其他类
java·前端·数据库
小妖6663 小时前
css 中 content: “\e6d0“ 怎么变成图标的?
前端·css
L耀早睡4 小时前
mapreduce打包运行
大数据·前端·spark·mapreduce