我有一个场景,用户可以使用拖放功能上传文件。
我将效果与空的空缺数组配合使用来设置RXJS订阅,该订阅处理已删除的文件和上载时间:
const [attachments, setAttachments] = useState([])
useEffect(() => {
...
fileUploadSubject.subscribe(newAttachments => {
setAttachments([...attachments,newAttachments])
})
...
return () => {
subscriptions.forEach(s => {
s.unsubscribe()
})
}
},[])
问题在于效果与
attachments
以及setAttachments
函数有关。如果我将
attachments
添加到依赖项数组,则将退订现有的上载。另外,由于其关闭,attachment
状态不会在效果内更新。我该如何解决这样的情况?我想到了多种方法,但似乎找不到简单的方法。
最佳答案
useState
的setState函数支持functional updates形式:
const [attachments, setAttachments] = useState([])
useEffect(() => {
...
const subscription = fileUploadSubject.subscribe(newAttachments => {
setAttachments((oldAttachments) => [...oldAttachments, newAttachments])
})
...
return () => subscription.unsubscribe()
}, [setAttachments, fileUploadSubject])
在依赖关系列表中可以省略永不更改的功能(即,在此两个功能都可以),但是我更愿意列出它们以防止忘记某些依赖关系。有eslint rules很难做到。