需求:一个附件列表,带上传功能,在上传时要求总附件数量不超过3个
分析:在上传时进行before验证,在onChange函数中进行计数清零及文件处理
场景:
1,没有文件,上传数量《=3,可一次性传完
2,没有文件,上传数量》3,提示数量超过3个,不上传,列表为空
3,有文件数量为1,上传数量《=2,可一次性传完
4,有文件数量为1,上传数量》2,提示数量超过3个,不上传,列表不变
基于以上场景,我们的思路是,根据antd api的特性,当选择好文件之后,先执行beforeUpload钩子,有几个文件调用几次,这样我们可以定义个全局变量beforeUploadCounter来统计,onChange函数是IO异步操作之后的的钩子函数
思路是:
1,计算beforeUploadCounter次数
2,计算当前文件列表数量this.state.fileList.length
3,当上传文件个数+已有附件个数 超过3个时,设置继续上传变量continueUpload为false
4,在onChange钩子函数中,判断continueUpload 是否为false,如果为false,return false,不继续后面的操作
5,由于beforeUploadCounter是全局函数,在下一次选择上传的时候需要把它清零,以免影响计算。
代码
let beforeUploadCounter = 0; // 上传的次数,可以统计到多少个文件
let allFilesLength = 0; //上传文件个数+当前文件列表个数
let continueUpload = true; //是否继续上传
beforeUpload(file) {
continueUpload = true;
beforeUploadCounter++
allFilesLength = beforeUploadCounter + this.state.fileList.length
continueUpload = allFilesLength < 4;
if (allFilesLength === 4) {
Modal.error({
title: '上传的文件不能超过3个,请重新选择'
});
}
if (allFilesLength >= 4) {
return false
}
},
fileChange(info) {
beforeUploadCounter = 0;
if (!continueUpload) {
return false
}
//业务逻辑。。。省略
this.setState({ fileList });
}