首页 > Web开发 > 详细

vue+element ui 的上传文件使用组件

时间:2018-09-11 23:20:49      阅读:903      评论:0      收藏:0      [点我收藏+]

前言:工作中用到 vue+element ui 的前端框架,使用到上传文件,则想着封装为组件,达到复用,可扩展。转载请注明出处:https://www.cnblogs.com/yuxiaole/p/9630868.html

网站地址:我的个人vue+element ui demo网站 

github地址:yuleGH github

技术分享图片

组件代码如下:

<div id="uploadComponent" style="display: none">
    <el-upload ref="upload" class="upload-demo" :action="action" :data="data" :file-list="fileList"
               show-file-list :limit="limit" :accept="accept" :disabled="disabled" :auto-upload="true"
               :on-error="handleError" :on-success="handleSuccess" :on-remove="handleRemove" :on-exceed="handleExceed" :on-preview="handlePreview"
               :before-upload="beforeAvatarUpload" :before-remove="beforeRemove">
        <el-button size="small" type="primary">选择文件</el-button>
    </el-upload>
</div>

以及:

<script type="text/javascript">
    var uploadComponent = {
        template : document.getElementById("uploadComponent").innerHTML,
        data : function(){
            return {
                action : this.uploadUrl,
                data : {},//向后台传额外参数
                limit : this.fileLimit,
                disabled : this.uploadDisabled,

                //接收文件类型,从数据字典取值
                accept : ".jpg,.pdf",
                //文件大小,从数据字典取值
                uploadMaxSize : 1024*1024
            }
        },
        props: {
            /**
             * 默认显示的附件
             */
            attachmentList : {
                type: Array,
                default : function(){
                    return [];
                }
            },
            /**
             * 初始化上传组件,是否禁用
             */
            uploadDisabled : {
                type: Boolean,
                default : false
            },
            /**
             * 上传地址
             */
            uploadUrl : {
                type : String,
                required : true
            },
            /**
             * 文件    最大允许上传个数
             */
            fileLimit : {
                type : Number,
                default : 5
            }
        },
        computed: {
            //默认文件列表
            fileList : {
                get : function(){
                    if(!this.attachmentList){
                        return [];
                    }
                    //可能会根据后台字段做一些特殊转换
                    return this.attachmentList;
                },
                set : function(){
                    console.log("set");
                }
            }
        },
        watch:{

        },
        created:function () {
        },
        mounted : function(){
            var _self = this;
            this.$nextTick(function () {
            })
        },
        methods :  {
            /**
             * 获取当前所有的附件
             * @return {Array}
             */
            getUploadFilesList : function(){
                var uploadFiles = this.$refs.upload.uploadFiles;
                return uploadFiles;
            },
            /**
             * 设置组件可用
             */
            setEditable : function(){
                this.disabled = false;
            },
            /**
             * 设置组件不可用
             */
            setDisEditable : function(){
                this.disabled = true;
            },



            /**
             * 上传失败
             * @param err
             * @param file
             * @param fileList
             */
            handleError : function(err, file, fileList){
                showAlert.call(this, 上传失败,系统未知错误!错误码为【500】, iconConstants.ERROR);
            },
            /**
             * 上传成功
             * @param response
             * @param file
             * @param fileList
             */
            handleSuccess : function(response, file, fileList){
                if(response.id){
                    //成功
                    showAlert.call(this, "上传成功!", iconConstants.SUCCESSAUTO);
                }else{
                    //出错
                    showAlert.call(this, "上传失败!" + response.buinessMsg, iconConstants.ERROR);

                    //删除该文件
                    var i = this.getFile(file, fileList);
                    fileList.splice(fileList.indexOf(i), 1);
                }
            },
            getFile: function (file, fileList) {
                fileList.forEach((x, i)=>{
                    if(x.uid === file.uid){
                        return x;
                    }
                });

                return null;
            },
            /**
             * 移除文件之前
             * 删除文件之前的钩子,参数为上传的文件和文件列表,若返回 false 或者返回 Promise 且被 reject,则停止上传。
             * @param file
             * @param fileList
             */
            beforeRemove : function(file, fileList){
                if(file){
                    var _self = this;
                    var result = showConfirmNoCancelCallBack.call(_self, "是否删除(" + file.name + ")?", iconConstants.QUESTION, function(){
                        showAlert.call(_self, "ajax访问后台删除,操作成功!", iconConstants.SUCCESSAUTO);
                    });
                    return result;
                }
            },
            /**
             * 删除文件
             * @param file
             * @param fileList
             */
            handleRemove : function(file, fileList){

            },
            /**
             * 文件超出个数限制时的钩子
             * @param files
             * @param fileList
             */
            handleExceed : function(files, fileList){
                showAlert.call(this, "当前限制选择 "+this.limit+" 个文件,本次选择了 "+files.length+" 个文件,共选择了 "+files.length + fileList.length+" 个文件", iconConstants.WARNING);
            },
            /**
             * 点击文件列表中已上传的文件时的钩子
             * @param file
             */
            handlePreview : function(file){
                console.log(file);
                showAlert.call(this, "访问后台下载,操作成功!", iconConstants.SUCCESSAUTO);
            },
            /**
             * 校验文件
             * 上传文件之前的钩子,参数为上传的文件,若返回 false 或者返回 Promise 且被 reject,则停止上传。
             * @param file
             * @return {boolean}
             */
            beforeAvatarUpload: function(file){

                if (file.size > this.uploadMaxSize) {
                    showAlert.call(this, "您文件大小不合法", iconConstants.ERRORAUTO);
                    return false;
                }

                if(file.name.indexOf(",") > 0){
                    //您的文件名不合法,不能包含逗号,请检查后重新上传!
                    showAlert.call(this, "您的文件名不合法,不能包含逗号,请检查后重新上传!", iconConstants.ERRORAUTO);
                    return false;
                }

                return true;
            }
        }
    };
</script>

完。整体代码见 GitHub。

 

转载请注明出处:https://www.cnblogs.com/yuxiaole/p/9630868.html

 

vue+element ui 的上传文件使用组件

原文:https://www.cnblogs.com/yuxiaole/p/9630868.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!