赞
踩
<Modal visible={isShowUploadModal} //弹框是否显示 onOk={this.handleCloseModel} // 点击确定时的操作 onCancel={this.handleCloseModel} //点击取消时的操作 title="文件上传" // 关闭时销毁子元素,这个很有用,相当于关闭的时候结束了组件的生命周期 destroyOnClose={true} > <Upload ref={this.modalRef} // 用到ref实现后面的弹框颜色控制 action={apis.DeviceManagement} // 上传的地址 headers={ { Authorization: token } // 可以在header里加上token } maxCount={1} // 最大上传数量,控制为1 accept=".xls, .xlsx" //upload文件接收什么样的文件 beforeUpload={this.handlerBeforeUpload} // 上传前的操作记录 onChange={this.statusChange} //上传后的操作记录 > <Button type="primary"> 点击上传 </Button> </Upload> </Modal>
// 文件上传的拦截 handlerBeforeUpload = (file, fileList) => { const { size } = file if (size / 1024 / 1024 > 10) { message.error("文件大小不能超过10兆") return Upload.LIST_IGNORE } this.setState({ uploadLoading: true }) return true } //onChange上传文件状态变化,有三个状态status:uploading done error。 //beforeUpload拦截的文件没有这些status // 所以在onChange中将拦截的文件进行处理,一般来说,上传的文件要么走到error, //要么走到done,进入error状态,代表接口报错了。走到done状态代表了上传成功状态。 statusChange = (res) => { const { file, fileList } = res if (file.status == 'error') { message.error(file?.response?.msg||"文件上传失败,请检查一下数据是否有错") } if (file.status == 'done') { // 上传成功后重新获取数据 if (file.response.code === 100) { // 通过ref将upload组件获取到后,调用上传失败的函数,实现在已经done后还能触 //发向error状态时的字体颜色为红色状态 this.modalRef.current.onError("文件上传失败", file.response, file) } if (file.response.code === 200) { message.success(file.response?.msg || "文件上传成功") // 上传成功后重新获取数据 // this.getDeviceList() } } }
this.modalRef.current.onError("文件上传失败", file.response, file)
,file.response
就是后台返回的数据, file
是上传的文件。 <Upload
ref={this.modalRef}
action={apis.DeviceManagement}
headers={
{ Authorization: Token.token }
}
fileList={fileList} // 将fileList变为受控组件
maxCount={1}
accept=".xls, .xlsx"
beforeUpload={this.handlerBeforeUpload}
onChange={this.statusChange}
>
</Upload>
查阅了一下antd官网
为何 fileList 受控时,上传不在列表中的文件不会触发 onChange 后续的 status 更新 事件?
onChange 事件仅会作用于在列表中的文件,因而 fileList 不存在对应文件时后续事件 会被忽略
destroyOnClose
={true},当弹框关闭时可以销毁组件。Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。