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

File类型Input的onChange方法触发其他同类型Input的onChange方法异常问题

问题原因与解决方案

嘿,我一眼就发现问题所在了——你两个文件输入框的ID重复了!

在HTML规范里,页面上每个元素的id属性必须是唯一的。但你这里两个<Input>组件的id都是file-input,对应的<label>的htmlFor也都指向这个值。浏览器在匹配label和input关联关系时,只会找到第一个拥有该ID的元素,所以你点击第二个label时,实际上触发的是第一个文件输入框的onChange事件,自然就执行了第一个函数。

修复方法很简单:给两个输入框设置唯一ID

只需要把两个输入框的id改成不同的值,同时让对应的label的htmlFor匹配新ID就行,具体修改如下:

第一个图片输入区域(Front Image)

保持onChangeFrontImage函数逻辑不变,修改JSX部分:

<div className="box-1">
  <label htmlFor="file-input-front" >
    { previewFront ? <img src={previewFront} alt="icon" style={{ width: 50, height: 50 }} /> : <img src={Camera} alt="camera-icon" /> }
    <p>Framifrån</p>
  </label>
  <Input type="file" id="file-input-front" className='img-file' onChange={(e) => onChangeFrontImage(e)} />
</div>

第二个图片输入区域(Side Image)

先恢复你注释掉的onChangeSideImage逻辑,再修改JSX:

const onChangeSideImage = (e) => {
  if (e.target.files[0]) {
    console.log(e.target.files[0], 'console of side image')
    setSideImage(e.target.files[0])
    console.log("picture: ", e.target.files[0]);
    const sideReader = new FileReader();
    sideReader.addEventListener("load", () => {
      setPreviewSideImage(sideReader.result);
    });
    sideReader.readAsDataURL(e.target.files[0]);
  }
}
<div className="box-1">
  <label htmlFor="file-input-side" >
    { previewSideImage ? <img src={previewSideImage} alt="" style={{ width: 50, height: 50 }} /> : <img src={Camera} alt="camera-icon" /> }
    <p>Sida</p>
  </label>
  <Input type="file" id="file-input-side" className='img-file' onChange={(e) => onChangeSideImage(e)} />
</div>

这样修改后,每个label都会准确关联到对应的文件输入框,点击第二个输入区域时就会触发onChangeSideImage函数,两个输入框的操作就不会再混淆啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 06:52:58