反应隐藏的输入类型文件 onChange 不触发

时间:2021-02-06 13:26:08

标签: javascript reactjs

const passFromPicToUpload = (e) =>{
        hiddenFileInput.current.click();
        console.log("one")
    }

const handleProfilePicUpload = (e) =>{
    console.log("two")

    if(e.target.files[0]){
        setImage(e.target.files[0]);
        
    }
}

 return (
     <div className="profile">
      <div className="imageContainer" >
       <a href="#" onClick={passFromPicToUpload}>
        {
          profile.avatarUrl?<Image src={profile.avatarUrl} className="profile__image"  /> :<Image src="https://i.stack.imgur.com/l60Hf.png" className="profile__image" /> 
        }
       </a>
      </div>   
     <input type="file" ref={hiddenFileInput} onChange={handleProfilePicUpload} style={{display:'none'}} /> 

 </div>
)

所以基本上文件选择窗口正在显示,但在我选择图片后,“handleProfilePicUpload”没有触发。

2 个答案:

答案 0 :(得分:1)

您试图通过 onChange 事件模拟 click。将侦听器更改为 onClick

<input onClick={handleProfilePicUpload} .. />

更简洁的解决方案是使用标签:

<input type="file" id="file" style="display:none;">
<label for="file">
   <a>Image</a>
</label>

答案 1 :(得分:1)

您可以简单地使用标签:

.hidden {
  display: none;
}
<input type="file" name="file" id="my-file" class="hidden">
<label for="my-file">
   <img src="https://picsum.photos/200/300" width="100" height="100"> 
</label>

它的工作原理与 HTML 文件 input 标签的工作原理完全一样。

所以,你可以这样做:


function onFileChange(e) {
  setImage(e.target.files)
}

// ...

<label
  htmlFor="my-file"
  title="Click to choose a file"
>
  <img src="https://picsum.photos/200/300" width="100" height="100">
</label>
<input
  type="file"
  id="my-file"
  className="hidden"
  onChange={onFileChange}
/>