1、upload使用简介

1.1 在真实的项目中使用的时候,需要有个中转地址,upload里的action里的地址,是存放图片的地址,不是后台直接把数据存到库里的添加删除的地址(重要)。

upload里的action里的地址,是存放图片的地址。正确的顺序是:
调用查询接口获取数据-----展示数据------点击上传按钮,选择图片,上传到中转地址------中转地址,返回结果 ,以及图片的id name 等信息 ---- 点击图片上的删除按钮-----从中转地址 删除此图片 -------点击确定,将图片的信息(从中转地址得到的)发送给更新接口

这里一共3个接口: 查询的、中转存储的(支持删除和添加)、更新图片的。

upload部分代码

 <Uploadaction="http://61.50.111.214:28282/publish-system/humanActivity/xxxxx"name="files"listType="picture-card"multiplefileList={fileList}showUploadList={{showRemoveIcon:(props.timeType === 2 && props.task_state === 5) ||(props.timeType === 1 && props.task_state !== 2)? false: true,}}accept="image/*"maxCount={max_img_count}onChange={(info) => {handelFile(info);// setFileList(info.fileList);}}onPreview={handlePreview}>{(props.timeType === 2 && props.task_state === 5) ||(props.timeType === 1 && props.task_state !== 2)? null: uploadButton}</Upload>

和中转存储接口的,交互函数

 //info.file.status: uploading --- done   error  ---- delefunction handelFile(info) {if (info.file.status !== 'done') {setFileList(info.fileList);}if (info.file.status === 'error') {message.error(info.file.name + '文件上传失败');}if (info.file.status === 'done') {let imgs = info.fileList.map((value) => {let img;// 1、处理上传成功的数据if (value.response && value.response.data) {// 2、改成下面这种写法能解决闪动问题。//由于后续点击确定,调用接口塞数据的时候,需要每个图片的 在上传地址的 id。所以这里拼个id进去。保留原始返回的数据img = {...value,id: value.response.data[0].id,url: imgBaseUrl + value.response.data[0].url, //如果不加这个会,导致有时候无法预览(dog)};// 这种写法,直接将info.fileList的数据捞出来,只截取需要的简洁数据,会造成图片列表闪动的问题,应该是缺什么字段,导致的// img = {//   id: value.response.data[0].id,//    uid: value.response.data[0].id,//   name: value.response.data[0].name,//    status: 'done',//     url: imgBaseUrl + value.response.data[0].url,//    // url: value.response.data[0].url,// };} else {// 3、如果是之前处理过的数据、或者上传失败的数据,则没有value.response、value.response.data,直接塞进去就行img = value;}return img;});console.log(imgs);setFileList(imgs);}}

将所有图片信息,更新到数据库的方法

 // 点击确定function onOk() {let resourceIds = [];console.log(fileList);fileList.forEach((element) => {if (element.status === 'done') resourceIds.push(element.id);});
//这是调用 接口3  更新接口的appendPics({ questionId: props.id, resourceIds }, (res) => {if (res.code === 200) {message.success('保存成功!');hideModal();} else {message.error('保存失败,请稍后再试');}});}
1.2 为啥会闪动

由于handelFile(info);里的数据,并不是规范的传递给更新接口的数据,所以我写了下面的代码,来过滤出我需要 filelist 的属性

 function handelFile(info) {if (info.file.status !== 'done') {setFileList(info.fileList);}if (info.file.status === 'error') {message.error(info.file.name + '文件上传失败');}if (info.file.status === 'done') {let imgs = info.fileList.map((value) => {let img;// 1、处理上传成功的数据if (value.response && value.response.data) {// (!!!!看这里,错误写法!!!!)这种写法,直接将info.fileList的数据捞出来,只截取需要的简洁数据,会造成图片列表闪动的问题,应该是缺什么字段,导致的img = {id: value.response.data[0].id,uid: value.response.data[0].id,name: value.response.data[0].name,status: 'done',url: imgBaseUrl + value.response.data[0].url,};//  (!!!!看这里,正确写法!!!!)2、改成下面这种写法能解决闪动问题。// //由于后续点击确定,调用接口塞数据的时候,需要每个图片的 在上传地址的 id。所以这里拼个id进去。保留原始返回的数据// img = { ...value, id: value.response.data[0].id }; } else {// 3、如果是之前处理过的数据、或者上传失败的数据,则没有value.response、value.response.data,直接塞进去就行img = value;}return img;});console.log(imgs);setFileList(imgs);}}

1.3在网上看,还有个解决方法。挺离谱的,直接改样式,
 :global {.ant-upload-list-picture-card {padding-bottom: 0.2rem;// 解决图片多出来闪动的问题.ant-upload-animate-inline-leave.ant-upload-animate-inline-leave-active {// display: none !important;width: 0 !important;height: 0 !important;margin-right: 0.15rem !important;margin-bottom: 0.15rem !important;}}

这个还是会有问题,会造成,图片的间距没了,上传好才排版正常,总之,直接改样式是最蠢的行为

总结:如果你需要对handelFile(info)里的数据进行处理,不能直接捞出来,可以选择添加属性的方式,否则会出现闪动问题。可能是某个upload组件的必要字段在捞出来的时候被漏掉了。

antd Upload组件使用,出现闪动问题相关推荐

  1. antd Upload组件上传状态一直处于uploading

    antd Upload组件上传状态一直处于uploading 对于受控模式,需要在 onChange 中始终 setState fileList,保证所有状态同步到 Upload 内 import { ...

  2. antd pro项目中 antd Upload组件 基于 lrz 在上传前做图片压缩

    lrz npm和参数文档可供参考 import { Upload,Button} from 'antd'; import lrz from 'lrz';//处理函数 function compress ...

  3. antd upload取消图片删除按钮

    ** <UploadshowUploadList={{showRemoveIcon:false}}//加上这句代码onChange={this.uploadStateChange}beforeU ...

  4. Antd Upload 文件上传,自定义上传错误信息

    项目需求 使用antd Upload 组件 项目上要求前端对上传不符合标准的图片展示具体的错误信息 不设置action,即返回信息无response ,先在前端上传后调用接口保存 效果截图 主要是根据 ...

  5. antd vue upload组件上传视频并实现视频预览

    antd vue upload组件上传视频并实现视频预览 html代码 <form><a-form-itemlabel="商品视频":labelCol=" ...

  6. 对于 React 结合 Antd 的 Upload 组件实现图片上传

    一. React 结合 Antd 实现图片上传 引入所需相关的组件和文件,代码如下所示: import React, { Component } from 'react' import PropTyp ...

  7. antd 上传进度_antd vue upload组件使用customRequest上传文件显示文件上传进度

    antd-vue上传文件upload组件使用自定义上传方法customRequest无法显示文件上传进度条,如下图红框内的进度条无法显示当前文件上传进度 于是,在网上搜索解决方案: 第一种解决方案是自 ...

  8. ant design 预览图片_AntD框架的upload组件上传图片时遇到的一些坑

    前言 本次做后台管理系统,采用的是 AntD 框架.涉及到图片的上传,用的是AntD的 upload 组件. 前端做文件上传这个功能,是很有技术难度的.既然框架给我们提供好了,那就直接用呗.结果用的时 ...

  9. Antd Upload 和 Antd Form 结合的踩坑记录

    今天弄了半天这个上传组件结合表单组件的问题. 这个上传文件列表,如果是当前正在修改或者上传成功,当然是可以正常工作的,但是想要增加一个功能: 下次打开 Modal 时,表单字段中的上传文件字段,可以默 ...

最新文章

  1. 美国科技界高度关注中国科技创新进展
  2. maven隐式依赖引起的包冲突
  3. 辞旧迎新:2018年的分区你们建了吗?
  4. 转型HTML5前端工程师怎样学才能拿高薪?
  5. 快捷操作之争【原创】
  6. 小花语音机器人(零)-单片机控制驱动板PCB
  7. Tomcat Get请求中文乱码
  8. 校验一,两位小数0-999999.99,填写其他内容提示“成绩填写有误”
  9. Efficient Protocols for Set Membership and Range Proof 学习笔记
  10. vcard文件怎么导入手机_如何在Outlook 2013中将联系人导出到vCard(.vcf)文件或从vCard文件导入联系人...
  11. MQTT.fx连接阿里云物联网平台
  12. IDEA报错:Failed to obtain JDBC ConnectionCannot create PoolableConnectionFactory
  13. 用java的io方法扫描硬盘,JavaSE IO
  14. AutoCAD.Net开发问题之:层表事件的响应(续)
  15. Firebird 2.5的部分操作
  16. MXC MINI 回路器
  17. 【供应链 销售管理】业务单据:“销售订单”业务操作-“[销售订单-TYXXXSDD003866-修改]”冲突,请稍候再使用。
  18. 大牛都会用的IDEA调试技巧!!!
  19. 使用OpenTSDB进行Grafana视图展现
  20. 关于等保2.0,这些是你应该知道的

热门文章

  1. 如何下载网页中的视频(无需下载其他软件的方法,只需要一个浏览器)
  2. 无线传感器网络(期末重点)
  3. 网狐DevTools数据生成器
  4. matlab accumulation,Matlab学习笔记(三)
  5. 如何在优麒麟操作系统安装QQ、微信
  6. python3 urllib 内存泄露_【专家专栏】张昊 | 从urllib2的内存泄露看python的GC
  7. KPI、KPA、OKR三者的区别
  8. 苹果正式发布Mac OS X Lion系统
  9. 18-Jenkisn-Pipelin-声明式流水线语法-triggers/stage/tool
  10. ubuntu修改u盘权限_手把手教你使用U盘安装Ubuntu系统