javascript - 如何使用 React 钩子将文件对象设置为状态?
问题描述
我想添加到从输入类型文件中获取的状态和文件对象,我的问题是我无法用这个更新状态:
currentTarget.files[0]
我收到此错误:
DOMException:无法在“HTMLInputElement”上设置“value”属性:此输入元素接受文件名,该文件名只能以编程方式设置为空字符串。
const [data, changeData] = useState({
name: '',
surname: '',
cv: '',
});
HandleChangeEvent 获取数据
const handleChangeData = ({ currentTarget }, key) => {
if (currentTarget.type === 'file') {
const files = currentTarget.files[0];
changeData((prevState) => {
console.log(prevState);
return { ...prevState, [key]: files };
});
} else {
// Validate property
const val = currentTarget.value;
const errorMessage = validateProperty(currentTarget);
if (errorMessage) errors[currentTarget.name] = errorMessage;
else delete errors[currentTarget.name];
changeData((prevState) => {
return { ...prevState, [key]: val };
});
}
};
我想files
从输入字段中获取属性并将其发送到后端
解决方案
@chumakoff 回答提供了一个很好的解决方案,但值得注意的是,这与反应无关。这就是浏览器的工作方式。
您只添加了部分代码,所以我假设您正在尝试创建一个用于设置值和更改处理程序的钩子,就像您将使用 default 一样 <input type="text"/>
。
但是,工作方式不同 -出于安全原因<input type="file"/>
,只有用户可以设置它的值(即文件对象和文件名)。正如错误提示的那样,您唯一可以将此值设置为 - 一个空字符串。
请参阅有关 Angular 的这个问题,它会产生相同的错误。
推荐阅读
- javascript - 如何使用 vuetify Grid 获得简单的布局?
- php - 在 Laravel-Vue 项目上运行 npm run watch 时出错
- c++ - 如何调整 FFT 结果中的非指定频率?
- google-chrome - 在 Chrome 开发者工具中,当一个对象带有“constructor”前缀是什么意思?
- ios - MKLocalSearch 如何避免带有“搜索附近”的结果?
- python - 是否有内置方法来检查字符串是否可以转换为浮点数?
- javascript - RouterContext - 错误:不变量失败:您不应该使用
外面 - ruby-on-rails - Ruby 数组按月分组
- python - (Flask)Heroku 错误:sqlalchemy.exc.ProgrammingError:(psycopg2.errors.DuplicateTable)关系“用户”已经存在
- node.js - mongodb $查找带有投影的数组中的嵌套对象