需求:一個(gè)附件列表,帶上傳功能,在上傳時(shí)要求總附件數(shù)量不超過3個(gè)
分析:在上傳時(shí)進(jìn)行before驗(yàn)證,在onChange函數(shù)中進(jìn)行計(jì)數(shù)清零及文件處理
場景:
1,沒有文件,上傳數(shù)量《=3,可一次性傳完
2,沒有文件,上傳數(shù)量》3,提示數(shù)量超過3個(gè),不上傳,列表為空
3,有文件數(shù)量為1,上傳數(shù)量《=2,可一次性傳完
4,有文件數(shù)量為1,上傳數(shù)量》2,提示數(shù)量超過3個(gè),不上傳,列表不變
基于以上場景,我們的思路是,根據(jù)antd api的特性,當(dāng)選擇好文件之后,先執(zhí)行beforeUpload鉤子,有幾個(gè)文件調(diào)用幾次,這樣我們可以定義個(gè)全局變量beforeUploadCounter來統(tǒng)計(jì),onChange函數(shù)是IO異步操作之后的的鉤子函數(shù)
思路是:
1,計(jì)算beforeUploadCounter次數(shù)
2,計(jì)算當(dāng)前文件列表數(shù)量this.state.fileList.length
3,當(dāng)上傳文件個(gè)數(shù)+已有附件個(gè)數(shù) 超過3個(gè)時(shí),設(shè)置繼續(xù)上傳變量continueUpload為false
4,在onChange鉤子函數(shù)中,判斷continueUpload 是否為false,如果為false,return false,不繼續(xù)后面的操作
5,由于beforeUploadCounter是全局函數(shù),在下一次選擇上傳的時(shí)候需要把它清零,以免影響計(jì)算。
代碼
let beforeUploadCounter = 0; // 上傳的次數(shù),可以統(tǒng)計(jì)到多少個(gè)文件
let allFilesLength = 0; //上傳文件個(gè)數(shù)+當(dāng)前文件列表個(gè)數(shù)
let continueUpload = true; //是否繼續(xù)上傳
beforeUpload(file) {
continueUpload = true;
beforeUploadCounter++
allFilesLength = beforeUploadCounter + this.state.fileList.length
continueUpload = allFilesLength < 4;
if (allFilesLength === 4) {
Modal.error({
title: '上傳的文件不能超過3個(gè),請重新選擇'
});
}
if (allFilesLength >= 4) {
return false
}
},
fileChange(info) {
beforeUploadCounter = 0;
if (!continueUpload) {
return false
}
//業(yè)務(wù)邏輯。。。省略
this.setState({ fileList });
}