博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
element-ui upload组件
阅读量:5946 次
发布时间:2019-06-19

本文共 3181 字,大约阅读时间需要 10 分钟。

前言

最近在用vue开发一个后台管理系统,搭配着Element-UI一起使用。其中一个部分用到了Element-UI中的upload组件,在用的过程中碰到了不少的小坑,官网上一些函数的用法只是在Attribute属性中做了一些简介,我觉得还不够清晰,所以想写一些我在第一次使用upload组件时候遇到的坑和小问题给大家分享一下。

坑1/:onSuccess:'uploadSuccess' onError:'uploadError'

clipboard.png

刚看到红色文字的我,很激动,心里理所应当的就认为:触发on-success钩子的时候就代表文件上传成功,触发on-error的时候就代表着文件上传失败。于是哗哗哗就写下了下面几行代码。

uploadSuccess(){            this.$message({              message: '恭喜你,上传成功',              type: 'success'            });          },          uploadError(){            this.$message.error('上传失败,请重新上传');          }

嘿嘿嘿,很开心,以为这两个钩子已经完美的处理了我的问题了。在后来测试发现,无论上传成功上传失败显示的都是:恭喜你,上传生成。这时候我就发现问题来了,上传成功与失败是根据后台小哥给我返回的status来判断的(我我们这边定义好的接口),当他返回的status的值为1时就是上传成功,status的值为0的时候就是文件已经存在,status的值为-1的时候就上传失败。由于后台没有给我抛出错误,所以根本不会走到on-error这个钩子。这时候我再仔细的看官方文档发现on-success钩子的函数中function(response, file, fileList)第一个参数是response,也就是后台给我们返回的结果。于是我把代码改成下面这样子,终于完美的解决了这个问题。

uploadSuccess(res){            if(res.status==1){              this.$message({                message: '恭喜你,上传成功',                type: 'success'              });            }else if(res.status==0){              this.$message({                message: res.msg,                type: 'warning'              });            }else{              this.$message.error('上传失败,请重新上传');            }          },          uploadError(){            this.$refs.upload.clearFiles();            this.$message.error('上传失败,请重新上传');          }        }

坑2/异步问题

老大想让我在文件上传前,加一个弹框,让用户修改文件名字的功能。于是我就想,在before-upload这个钩子上处理就好了吧(注明:before-upload这个钩子return fasle的话,文件会停止上传的)。于是我在before-upload钩子上直接加了个弹框,代码类似下面的。

:before-upload="beforeUpload"        beforeUpload(){          this.$prompt('请输入文件名', '提示', {          confirmButtonText: '确定',          cancelButtonText: '取消',          inputValue:this.value,            }).then(({ value }) => {                return true;            }).catch(() => {                return false;            });        }

很可惜哈哈哈,这个函数是异步执行的,然后upload组件默认是自动上传的,因为没有等到return,upload组件已经自动上传完毕了。激不激动,惊不惊喜。

于是我决定把自动上传文件这个功能给关闭了。
如何关闭?

点击上传

通过设置:auto-upload="false"这个属性就可以关闭自动上传的功能了。

那么关闭自动上传功能以后如何手动提交?
加个ref属性,然后通过this.$refs.upload.submit();就可以手动提交了。
不想加个一个提交按钮的情况下,我应该在哪里提交呢?

clipboard.png

在官方文档中可以发现有一个on-change的钩子,它是一个检测文件状态改变时的钩子,让我欣喜的是它可以检测添加文件时的状态,让我难过的是:添加文件、上传成功和上传失败时都会被调用。

但是我还是觉得这个钩子函数充满了希望,于是对它进行多次的测试,发现它的file对象中包含了文件上传的状态,于是我就检测判断是否添加完文件后的状态。添加完文件后,弹框让用户输入文件名,当用户点击确认按钮再手动触发this.$refs.upload.submit()提交上传。代码如下:

changeFile(file){            if(file.status=='ready'){              this.$prompt('请输入上传后的文件名', '提示', {                confirmButtonText: '确定',                cancelButtonText: '取消',                inputValue:file.name              }).then(({ value }) => {                this.fileName.name = value;                this.$refs.upload.submit();              }).catch(() => {                this.$refs.upload.clearFiles();                this.$message({                  type: 'info',                  message: '取消文件上传'                });              });            }          }

小tips

clipboard.png

在官方文档中可以看到,upload组件中有2个Methods,这两个Methods是怎么调用了呢,其实上面也有涉及到。定义一个refs属性(注意后面的upload是我refs中定义的名字),然后通过this.$refs.upload.clearFiles()、this.$refs.upload.abort()即可调用。clearsFiles可以清空显示在页面上的文件列表。

转载地址:http://khbxx.baihongyu.com/

你可能感兴趣的文章
设计模式原则之里氏替换原则
查看>>
LeetCode: Longest Common Prefix 解题报告
查看>>
Multipart polyline to single part lines
查看>>
zeromq_传说中最快的消息队列
查看>>
ARM的栈指令
查看>>
两个tomcat一起启动
查看>>
javax.imageio.IIOException: Unsupported Image Type
查看>>
Oracle DBA之监听的静态注册与动态注册
查看>>
Oracle Golden Gate 系列十七 -- GG 一对多 real-time data distribution 说明 与 示例
查看>>
大照片背景在网页设计中应用的精美作品范例(下篇)
查看>>
Realtek 8192cu win8 驱动
查看>>
property 中的strong 与weak
查看>>
使用HDFS java api 创建文件出错。
查看>>
支持多个文档类型的文档视结构程序
查看>>
【原创】FIFO的基础和时序分析学习
查看>>
Nginx学习之十一-Nginx启动框架处理流程
查看>>
[置顶] 吃论扯谈---吃货和Office 365订阅的关系
查看>>
蓝桥杯 基础练习 十六进制转十进制(水题,进制转换)
查看>>
php有些系统会报错或提示 Cannot modify header information - headers already sent by
查看>>
从零開始开发Android版2048 (五) 撤销的实现
查看>>