迭代 FileList、React、Typescript

IT技术 reactjs typescript
2021-05-15 17:15:33

我正在“重新激活”一个文件输入,但无法遍历选定的文件。

private onInputChanged = (e: React.FormEvent<HTMLInputElement>): void => {
  let files: FileList | null =  e.currentTarget.files;
  files.map( file => console.log("Do something with " + file.name));
}
<input 
    type="file"
    onChange={this.onInputChanged}
/>

这是我的问题的一个准系统示例。FileList 不能与 .map(... 一起使用,也不能与 .forEach(...

如何完成选定文件的迭代?

错误:类型“FileList”上不存在属性“map”

3个回答

FileList是一个类似于 Array 的对象,它具有length属性和索引值,但它缺少 Array 方法,例如 map。在 ES6 中,您可以使用spreadArray#from将其转换为真正的数组。在 ES5 中,您可以调用Array#slice来转换为数组,或者调用FileList 上的方法。

注意:如果 Array#from 导致TypeScript | Array.from | 错误 TS2339:属性 'from' 在类型 'ArrayConstructor' 上不存在错误,将默认目标(es3)更改为 ES6 "target": "ES6"-- 在"tsconfig.json"编译器选项,或在命令中使用 --target ES6线。

Array.from 演示:

const onInputChanged = (e) => {
  const files =  e.currentTarget.files;
  
  Array.from(files).forEach(file => console.log("Do something with " + file.name));
}
<input 
    type="file"
    onChange="onInputChanged(event)"
/>

调用 forEach 演示:

const onInputChanged = (e) => {
  const files =  e.currentTarget.files;
  
  [].forEach.call(files, file => console.log("Do something with " + file.name));
}
<input 
    type="file"
    onChange="onInputChanged(event)"
/>

FileList接口是使用索引来访问:

for (let i = 0; i < files.length; i++) {
    console.log(files[i].name);
    //or
    console.log(files.item(i).name);
}

您可以将索引与[0]或 via一起使用item(0)

您可以仅迭代 FileList:

for (let file of files) {
    console.log("Do something with " + file.name)
}