解决问题:
fileRef.current.value = ""
// 如果是原生实现,则是 document.getElementById("image_uploads").value = ""
PS: 网上同类原生实现的解决方案replaceWith👎
document.getElementById("image_uploads").replaceWith(<input type="file" />)
其原理本质上是将原来的DOM组件换成一个新的,没必要。
1. 替换的时候还有方法
2. React中该方案鸡肋
完整实现代码:
html代码
<div className="image_upload_container">
<label id="upload_button" htmlFor="image_uploads">
<i className="iconfont icon-a-danchuang-shangchuantupian"></i>
<span>上传</span>
<input ref={fileRef} onChange={uploadFile} accept={fileType || ".jpg, .gif, .png"} type="file" id="image_uploads" />
</label>
<div className="preview" ref={previewRef}>
</div>
</div>
对应方法:
const uploadFile = (e) => {
removeAllPreview()
const mask = document.createElement("div")
mask.className = "mask"
const icon = document.createElement("i")
icon.className = "iconfont icon-biaoge-shanchu"
icon.addEventListener("click", () => {
e.stopPropagation()
removeAllPreview()
if (fileRef.current) {
fileRef.current.value = ""
mask.appendChild(icon)
const curFile = fileRef.current && fileRef.current.files
const image = document.createElement("img")
image.src = URL.createObjectURL(curFile[0])
previewRef.current.appendChild(image)
previewRef.current.appendChild(mask)
if (curFile[0] && curFile[0].size > maxSize) {
sizeRef.current.innerHTML = "图片尺寸不能超过" + (maxSize/(1024*1024)).toFixed(3) + "M"
} // 将文件值传递给外界
handleFile(curFile[0])