在Promise内部更新State后,调用函数中State仍为空的问题
问题原因
React的状态更新是异步批量处理的,调用setTradeFilesToUpload(res)后,状态不会立刻同步更新。当你紧接着调用uploadFiles()时,组件还没完成重新渲染,tradeFilesToUpload仍然是更新前的空值,所以会出现这个问题。
两种解决方案
方案1:直接传递结果给uploadFiles
既然已经拿到了res,没必要非要等状态更新,直接把结果作为参数传给uploadFiles,绕开状态异步的问题:
Promise.all(fileObjs).then((res) => { setTradeFilesToUpload(res); uploadFiles(res); // 直接传处理后的结果 });
同时修改uploadFiles函数,让它接收这个参数来使用,而不是读取组件状态:
const uploadFiles = (files) => { // 这里用传入的files替代tradeFilesToUpload console.log(files); // 就能拿到最新的文件列表了 };
方案2:用useEffect监听状态变化
如果业务逻辑必须依赖组件状态,那就用useEffect监听tradeFilesToUpload的变化,当状态更新后自动触发uploadFiles:
// 监听状态变化,更新后调用uploadFiles useEffect(() => { // 加个判断,避免初始空状态时触发 if (tradeFilesToUpload.length > 0) { uploadFiles(); } }, [tradeFilesToUpload]); // 依赖项设为tradeFilesToUpload // 原Promise回调只负责更新状态 Promise.all(fileObjs).then((res) => { setTradeFilesToUpload(res); });
内容的提问来源于stack exchange,提问作者Maheskumar
相关产品推荐
相关产品推荐

