【发布时间】:2021-07-01 08:28:45
【问题描述】:
当我提交表单时,它会重新加载,但是当没有选择文件时,它不会重新加载,只显示一条错误消息“未上传文件”。 只有在我提交文件时才会重新加载。
我已经使用了 e.preventDefault() 来防止重新加载,但它不起作用。
组件代码
import React, { Fragment, useState } from 'react'
import axios from 'axios'
const FileUpload = () => {
const [file, setFile] = useState('');
const [filename, setFilename] = useState('Choose File')
const [uploadedFile, setUploadedFile] = useState({})
const onChange = (e) => {
setFile(e.target.files[0]);
setFilename(e.target.files[0].name);
}
const onSubmit = async (e) => {
e.preventDefault();
const formData = new FormData();
formData.append('file', file);
try {
const res = await axios.post('/upload', formData, {
headers: {
'Content-Type': 'multipart/form-data'
}
})
const { fileName, filePath } = res.data;
setUploadedFile({ fileName, filePath });
console.log(uploadedFile);
} catch (err) {
if (err.response.status === 500) {
console.log("There was a problem with the server.");
} else {
console.log(err.response.data.msg);
}
}
}
return (
<Fragment>
<form onSubmit={onSubmit}>
<div className="mb-3">
<label htmlFor="formFile" className="form-label">{filename}</label>
<input className="form-control" type="file" id="formFile" onChange={onChange} />
</div>
{/* <button type="submit" value="Upload" className="btn btn-primary w-100" /> */}
<button className="btn btn-primary w-100" type="submit">Upload</button>
</form>
</Fragment>
)
}
export default FileUpload
任何人都可以帮我解决这个问题。
【问题讨论】:
-
您的问题是您的表单没有
action属性,即action="/link_to_some_page"。这会使表单返回其默认行为,即将数据发送到其当前 URL,这就是您遇到此行为的原因。您要么需要指定表单数据的发送位置,要么通过将e.preventDefault()propagation 应用于表单的提交来防止默认行为。或者,您可以利用 AJAX 并异步发送数据。 -
我已经将
e.preventDefault()应用于提交事件,并使用 axios 将数据发布到我的 API URL