【发布时间】:2021-03-26 15:57:39
【问题描述】:
我目前遇到一个问题,即使用数组过滤的多个 setState 相互干扰。基本上,如果用户上传了两个文件,并且它们几乎同时完成,那么其中一个不完整的文件可能无法从数组中过滤出来。
我最好的猜测是,这是因为他们分别过滤掉了需要过滤的那个,当第二个完成并将自己过滤出数组时,它仍然有旧的不完整数组的副本其中第一个文件尚未被过滤掉。有什么更好的方法来解决这个问题?我错过了一些明显的东西吗?我正在考虑使用一个对象来保存文件,但是我需要为渲染部分创建一个自定义映射函数,以便它仍然可以像数组一样被渲染。
fileHandler = (index, event) =>{
let incompleteFiles = this.state.incompleteFiles
incompleteFiles[index].loading = true
incompleteFiles[index].file = event.target.files[0]
this.setState({ incompleteFiles: incompleteFiles },()=>{
const fileData = new FormData()
fileData.append('file', event.targets[0].file)
let incompleteFiles = this.state.incompleteFiles
let completeFiles = this.state.completeFiles
api.uploadFile(fileData)
.then(res=>{
if(res.data.success){
this.setState(state=>{
let completeFile = {
name : res.data.file.name,
}
completeFiles.push(completeFile)
incompleteFiles = incompleteFiles.filter(inc=>inc.label !== res.data.file.name)
return{
completeFiles,
incompleteFiles
}
})
}
})
})
}
通过小幅调整更新了已接受的答案
fileHandler = (index, event) =>{
this.setState(({ incompleteFiles }) => ({
// Update the state in an immutable way.
incompleteFiles: [
...incompleteFiles.slice(0, index),
{
...incompleteFiles[index],
loading: true,
file: event.target.files[0],
},
...incompleteFiles.slice(index+1)
],
}), () => {
const fileData = new FormData()
fileData.append('file', event.targets[0].file)
api.uploadFile(fileData)
.then(res => {
if(res.data.success){
this.setState(({ incompleteFiles, completeFiles }) => ({
completeFiles: [
...completeFiles, // Again, avoiding the .push since it mutates the array.
{ // The new file.
name: res.data.file.name,
}
],
incompleteFiles: incompleteFiles.filter(inc=>inc.label !== res.data.file.name),
})))
}
})
});
}
【问题讨论】:
标签: arrays reactjs asynchronous filter state