当前位置:   article > 正文

uniapp uview1.0 页面多个upload上传、回显之后处理数据_uview1.0上传功能回显

uview1.0上传功能回显

  1. <view class="img-title w-s-color-3 f-28 row">商品图片</view>
  2. <u-upload ref="images" :header="header" :file-list="fileListImages" :action="action" name="iFile" icon-name="camera"
  3. upload-text="上传图片"></u-upload>
  4. <view class="img-title w-s-color-3 f-28 row">商品详情图片</view>
  5. <u-upload ref="content" :header="header" :file-list="fileListCotent" :action="action" name="iFile" icon-name="camera" upload-text="上传图片"></u-upload>

html结构如上,定义两种ref  'images'  ,'content' 

在提交的时候将两种ref形成数组进行循环

  1. subClick(){
  2. ['images','content'].map(item=>{
  3. this.getImg(item)
  4. })
  5. }

处理数据

  1. getImg(refText) {
  2. //refText为自己 定义的ref
  3. let files = [];
  4. // 通过filter,筛选出上传进度为100的文件(因为某些上传失败的文件,进度值不为100,这个是可选的操作)
  5. files = this.$refs[refText].lists.filter(val => {
  6. return val.progress == 100;
  7. })
  8. if(refText=='images' && files.length==0){
  9. this.$refs.uToast.show({
  10. title: '请上传商品图片',
  11. type: 'error'
  12. })
  13. return
  14. }
  15. if(refText=='content' && files.length==0){
  16. this.$refs.uToast.show({
  17. title: '请上传商品详情图片',
  18. type: 'error'
  19. })
  20. return
  21. }
  22. let ids=[]
  23. files.map(item=>{
  24. //在这里判断出是否为回显上去的图片,我拿出来的是图片id
  25. if(item.file_id){
  26. ids.push(item.file_id)
  27. }else{
  28. ids.push(item.response.data.file_id)
  29. }
  30. })
  31. //赋值给自己的数据
  32. this.skuQuery[refText]=ids.join(',')
  33. },

关于另外一个upload循环问题在这icon-default.png?t=N7T8https://blog.csdn.net/weixin_47517731/article/details/130184680?spm=1001.2014.3001.5501

补充一点 

如果你们后端返回图片是地址字符串模式 以逗号分隔,并且后端接受的图片也是地址模式

比如:images:"xxxxxxxxxxxxxxxxx,xxxxxxxxxxxxxxxxxx,xxxxxxxxxxxxxx"

可在u-upload源码中做如下修改

直接找到watch 监听的fileList属性,直接复制过去就好

  1. fileList: {
  2. immediate: true,
  3. handler(val) {
  4. if(typeof val=='object' && val){
  5. val.map(value => {
  6. // 首先检查内部是否已经添加过这张图片,因为外部绑定了一个对象给fileList的话(对象引用),进行修改外部fileList
  7. // 时,会触发watch,导致重新把原来的图片再次添加到this.lists
  8. // 数组的some方法意思是,只要数组元素有任意一个元素条件符合,就返回true,而另一个数组的every方法的意思是数组所有元素都符合条件才返回true
  9. let tmp = this.lists.some(val => {
  10. return val.url == value.url;
  11. })
  12. // 如果内部没有这个图片(tmp为false),则添加到内部
  13. // 如果市外部传进来的给它一个特殊的标志,并将图片id保存下来
  14. !tmp && this.lists.push({ url: value.url, error: false, progress: 100 ,file_id:value.file_id,external:true});
  15. });
  16. }else if(typeof val=='string'){
  17. if(!val)return
  18. let valList=val.split(',')
  19. valList.map((value,index) => {
  20. // 首先检查内部是否已经添加过这张图片,因为外部绑定了一个对象给fileList的话(对象引用),进行修改外部fileList
  21. // 时,会触发watch,导致重新把原来的图片再次添加到this.lists
  22. // 数组的some方法意思是,只要数组元素有任意一个元素条件符合,就返回true,而另一个数组的every方法的意思是数组所有元素都符合条件才返回true
  23. let tmp = this.lists.some(val => {
  24. return val.url == value;
  25. })
  26. // 如果内部没有这个图片(tmp为false),则添加到内部
  27. // 如果市外部传进来的给它一个特殊的标志,并将图片id保存下来
  28. !tmp && this.lists.push({ url: value, error: false, progress: 100 ,file_id:index+=1,external:true});
  29. });
  30. }
  31. }
  32. },

ps:最简单的一种 (上面的太复杂了,uview已经提供了相关的操作)

将数组循环的下标当作upload的索引,同时使用自带的方法

<u-upload :action="action"  icon-name="camera" max-count="6" :index="index" @on-success="successImg" @on-remove="removeImg"></u-upload>

后端返回的数据

 简单处理就直接将地址放进去了

  1. successImg(data, index, lists, name){
  2. console.log(data)
  3. this.list[name].annex.push(data.url)
  4. },
  5. removeImg(index,list,name){
  6. this.list[name].annex.splice(index,1)
  7. },

 使用该方法存在一定的错误将数组循环的下标当作upload的索引,同时使用自带的方法

 如果需要回显图片数据,使用数组中的annex图片数组进行回显,则会存在错误

由于即用annex数组进行回显又将最新的图片push到annex数组中,导致错误的新上传图片出现两次的情况

所以如果存在回显的情况

那么一定要在从后端拿到数据后进行数据的处理

以我下面的为例,重新深度克隆了一个回显数组出来,避免上述中的问题

<u-upload :action="action" :file-list="item.annexList" icon-name="camera" max-count="6" :index="index" @on-success="successImg" @on-remove="removeImg"></u-upload>

​​​​​​​

  1. res.data.forEach(item=>{
  2. item.annexList=this.$u.deepClone(item.annex)
  3. })

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/470905
推荐阅读
相关标签
  

闽ICP备14008679号