[英]Why must I pass a function to the setter function of 'useState' in React?
我正在使用react-dropzone
處理文件上傳,它使用文件列表調用以下 function :
const [files, setFiles] = useState([])
const onDrop = useCallback(async acceptedFiles => {
uploadFiles(acceptedFiles)
}, [])
然后我使用 fetch 上傳文件:
const uploadFiles = async acceptedFiles => {
acceptedFiles.forEach(async (file) => {
setFiles(array => [...array, fileState])
await fetch('/upload', {
method: 'POST',
body: data
}).then(res => {
// etc
})
})
}
如果我只用setFiles([...files, fileState])
(不在函數中)替換setFiles
調用,它會中斷,但這是為什么呢?
我相信我能夠重現您遇到的問題。 https://codesandbox.io/s/elegant-bouman-9lb5k?file=/src/App.js
以下是相關代碼:
const [files, setFiles] = useState(["file1", "file2"]);
const uploadFiles = async (acceptedFiles) => {
acceptedFiles.forEach(async (file) => {
//setFiles([...files, file]);
setFiles(array => [...array, file])
await fetch("https://httpstat.us/200");
});
};
const testFunc = async (acceptedFiles) => {
uploadFiles(["file3", "file4"]);
};
如果像上面那樣調用時行為符合預期,但如果您交換setFiles
調用,則只會附加file4
。
該問題似乎與 React 批處理 setState 調用有關,因為它們是連續進行的。 這篇文章提供了我能找到的最佳答案。
因此,當您使用回調調用 setFiles 時,React 不會批處理這些請求,因此會一個接一個地執行它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.