上传文件时百分比加载条超过100%后卡在99%怎么办?
大家好,我在做文件上传功能时遇到了百分比加载条显示问题。用axios的upload事件监听进度,发现当文件大小刚好是分片整数倍时,进度会跳到100%,但大部分时候会停在99%左右。我尝试在组件里用Math.min(progress, 100)强制限制,但实际界面还是偶尔显示99%。
代码结构是用useEffect订阅进度事件,用useState保存进度值。现在遇到的情况是服务端返回的loaded值有时会超过total,比如传了个5MB文件,loaded显示5012/5000。这种时候如何优雅地处理溢出情况?直接截断会不会影响动画流畅度?
const [progress, setProgress] = useState(0);
axios.upload(file, {
onUploadProgress: (event) => {
const newProgress = Math.floor((event.loaded / event.total) * 100);
setProgress(newProgress); // 这里偶尔会得到101%
}
});
// 尝试在渲染时限制
{Math.min(progress, 100)}%
修改代码如下:
这样能保证进度不会超过100%,动画也依然流畅。
event.loaded和event.total的时候可能存在一些小误差,导致比例超过100%。直接用Math.min(progress, 100)是个不错的思路,但还需要稍微优化一下逻辑。核心问题在于:
setProgress是异步的,如果你只是简单地在渲染时限制进度值,可能会因为状态更新不及时而短暂显示99%或者101%。所以最好的办法是在更新状态的时候就直接限制范围。下面是改进后的代码:
这样可以保证状态一开始就处于合法范围内,避免渲染层频繁判断。至于你提到的动画流畅性问题,其实基本不会有太大影响,因为即使出现101%,也是瞬间的事情,用户肉眼很难察觉到这种微小波动。
如果还是有问题,可以调试看看
event.loaded和event.total的具体值,确认是不是服务端返回的数据有偏差。不过大多数情况下,上面的写法已经足够优雅且可靠了。