reactjs - 如何输入文件上传的输入参考
问题描述
我正在尝试输入此参考作为输入,但我不知道。我用它来上传文件。关于如何输入这个的任何想法?
const ProfileLayout: React.FC = ({ children }) => {
let inputUpdateAvatarPhoto = useRef();
.
.
.
.
const handleImageChange = async (e: any) => {
const formData = new FormData();
formData.append('avatar', inputUpdateAvatarPhoto.files[0]);
.
.
.
.
<input
id="avatar"
accept="image/*"
type="file"
ref={input => (inputUpdateAvatarPhoto = input)}
onInput={e => {
handleImageChange(e);
}}
/>
解决方案
修复你的参考
你的裁判有很多问题:
- 您需要通过在
useRef
like上设置泛型来声明 ref 的类型useRef<HTMLInputElement>
。 - React 期望 DOM 元素 ref 的初始值
null
不是undefined
. - 您正在将ref 对象语法与回调 ref 语法混为一谈。使用 ref 对象,您只需将整个对象传递给 DOM 元素,例如
ref={inputUpdateAvatarPhoto}
- 为了访问 ref 对象的当前值,您需要查看
.current
属性
此代码应该可以工作,但下一个代码更好
const ProfileLayoutV1: React.FC = ({ children }) => {
const inputUpdateAvatarPhoto = useRef<HTMLInputElement>(null);
const handleImageChange = async (e: React.FormEvent<HTMLInputElement>) => {
const files = inputUpdateAvatarPhoto.current?.files;
// make sure that it's not null or undefined
if (files) {
const formData = new FormData();
formData.append("avatar", files[0]);
}
// need to set something
};
return (
<input
id="avatar"
accept="image/*"
type="file"
ref={inputUpdateAvatarPhoto}
onInput={(e) => {
handleImageChange(e);
}}
/>
);
};
你不需要参考
看看你的handleImageChange
函数如何获得一个事件e
,但不使用它? inputUpdateAvatarPhoto.current
是一样的e.currentTarget
!
我们实际上甚至不需要处理程序input
,因为您可以获得FormData
整个表单的对象!在 MDN 文档中查看此示例:使用 FormData 对象发送文件。
我们想在 上设置name
属性,input
因为这是用来确定其在FormData
对象中的键的。
const ProfileLayoutV2: React.FC = ({ children }) => {
const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {
// prevent the page from redirecting ot reloading
e.preventDefault();
// get the `FormData` for the whole form
const formData = new FormData(e.currentTarget);
// logs a `File` object
console.log(formData.get("avatar"));
};
return (
<form name="profile_form" onSubmit={handleSubmit}>
<input
id="avatar"
name="avatar"
accept="image/*"
type="file"
/>
<button type="submit">Submit</button>
</form>
);
};
请注意,如果您想File
直接使用,您需要检查它是否已定义。
const avatar = formData.get("avatar"); // type is `string | File | null`
if ( avatar instanceof File ) {
console.log("we have a file", avatar); // type is now just `File`
}
推荐阅读
- vb.net - 如何通过添加参数来搜索确切的控件类型而不是仅搜索文本框来更新此功能?
- c# - 调度程序不更新 ListBox 控件
- python - Python Pandas - 处理具有嵌套字典(json)值的列
- python - 检查时间控制并在 listrCtrl 中更改颜色
- django - 部署到亚马逊弹性豆茎后如何运行 collectstatic 脚本?
- message-queue - 消息总线 vs. 服务总线 vs. 事件中心 vs. 事件网格
- python - 在“从模块名导入变量”的情况下,可变性会改变命名空间的行为吗?
- leaflet - 将 choropleth 图层添加到 Leaflet 地图
- c# - 迭代 JArray 和 JArray.Children() 之间的区别
- html - 为什么这个 div 不使用 css 移动?