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>
相关推荐
掘金安东尼7 小时前
让 JavaScript 更容易「善后」的新能力
前端·javascript·面试
掘金安东尼7 小时前
用 HTMX 为 React Data Grid 加速实时更新
前端·javascript·面试
灵感__idea9 小时前
Hello 算法:众里寻她千“百度”
前端·javascript·算法
yinuo9 小时前
轻松接入大语言模型API -04
前端
袋鼠云数栈UED团队10 小时前
基于 Lexical 实现变量输入编辑器
前端·javascript·架构
cipher10 小时前
ERC-4626 通胀攻击:DeFi 金库的"捐款陷阱"
前端·后端·安全
UrbanJazzerati10 小时前
非常友好的Vue 3 生命周期详解
前端·面试
AAA阿giao10 小时前
从零构建一个现代登录页:深入解析 Tailwind CSS + Vite + Lucide React 的完整技术栈
前端·css·react.js
兆子龙11 小时前
像 React Hook 一样「自动触发」:用 Git Hook 拦住忘删的测试代码与其它翻车现场
前端·架构
兆子龙12 小时前
用 Auto.js 实现挂机脚本:从找图点击到循环自动化
前端·架构