加载进度条怎么在React里实时更新?
我用React做文件上传,想显示一个进度条,但setState之后界面没反应。明明onUploadProgress回调里打印的progress是变化的,可UI就是不动。是不是我状态更新的方式有问题?
试过把progress设成state,也在axios的onUploadProgress里调用了setProgress,但进度条卡在0%不动。代码大概是这样:
const [progress, setProgress] = useState(0);
const uploadFile = () => {
axios.post('/upload', file, {
onUploadProgress: (e) => {
const p = Math.round((e.loaded * 100) / e.total);
setProgress(p); // 这里log出来是正常数字,但UI不更新
}
});
};
e.total为0或undefined,导致进度计算出来是NaN或者0。在
onUploadProgress回调里先打个log确认一下:如果total是0或者undefined,那就是后端的问题了——服务器没有在响应头里返回Content-Length,axios拿不到文件总大小。
解决办法有两个:
一是让后端在响应头里加上
Content-Length。二是如果后端实在不返回,你只能做个假的进度条,比如用setInterval模拟一下,或者直接显示“上传中...”而不显示具体百分比。另外提醒一下,useState的更新在快速连续调用时可能会被React批量处理导致不生效,不过你这个场景应该不至于。如果确认total有值还是不动,可以试试用函数式更新:
先排查total的值吧,大概率是这个问题。