vue element-ui,上传文件加载进度条显示效果(使用定时器实现源码分享)

上传文件效果如图:

父组件相关代码

html

 <drag-upload
            ref=‘mychild‘
            action="//接口相关地址"
            v-model="versionwareList"
            @submitUploadParent=‘formSubmit‘
            @input=‘delUpload‘
            :autoUpload="autoUpload"
            :visible="visible"
            :disabled="disabled"
          />

js

 handleSubmit() {
        this.$refs.form.validate(async (valid) => {
          if (valid) {
            this.submitLoading = true;
            this.disabled = true;
            //数据校验成功,上传文件
            this.$refs.mychild.submitUpload();
            // this.submitLoading = false;
          } else {
            this.$message.error(‘请按照正确格式填写‘);
          }
        });
      },

子组件代码

<template>
  <!-- 文件拖拽上传 -->
  <div>
    <el-upload
      class="drag-upload"
      :action="action"//接口地址
      :name="name"//上传的文件字段名
      :data="otherParams"//上传时附带的额外参数
      :visible="visible"//根据父组件传值
      ref="upload"
      drag//是否启用拖拽上传
      :headers=‘xHeaders‘//设置上传的请求头部
      :limit="limit"//最大允许上传个数
      :file-list="value"//上传的文件列表
      :auto-upload="autoUploadVal"//是否自动上传文件
      :before-upload="beforeUpload"//上传文件之前的钩子
      :before-remove="beforeRemove"//删除文件之前的钩子
      :on-success="handleSuccess"//文件上传成功时的钩子
      :on-progress="onProgress"//文件上传时的钩子,进度条加载
      :on-remove="handleRemove"//文件列表移除文件时的钩子
      :on-preview="handlePreview"//点击文件列表中已上传的文件时的钩子
      :disabled="disabled"//是否禁用
    >
      <el-progress type="circle" v-if="loading" :percentage="percentage" :color="colors" class="progress"></el-progress>
      <i class="drag-upload__icon" :class="loading ? ‘‘ : ‘el-icon-upload‘ "></i>
      <p class="drag-upload__text" v-show="!loading">点击或直接将文件拖到此处上传</p>
      <p class="drag-upload__tip" v-show="!loading">文件大小不能超过{{sizeLimit}}MB!{{tip}},只允许上传{{limit}}个文件</p>
    </el-upload>
  </div>

</template>

<script>
  import axios from ‘axios‘;
  import Vue from ‘vue‘;
  export default {
    props: {
      // 文件列表
      value: {
        type: Array,
        default () {
          return [];
        }
      },
      autoUpload:{
        type: String,
        default: 0
      },
      //文件个数
      limit:{
        type: Number,
        default:1,
      },
      //上传地址
      action: {
        required: true,
        type: String,
        default: ‘‘,
      },
      // 对应inpu控件的name属性,后端依据这个字段获取文件。
      name: {
        type: String,
        default: ‘file‘
      },
      disabled:{
        type: Boolean,
        default: false
      },
      // 文件的大小限制,单位为MB
      sizeLimit: {
        type: Number,
        default: 1000
      },
      // 提示信息
      tip: {
        type: String,
        default: ‘‘
      },
      visible: {
        type: Boolean,
        default: false
      }
    },
    watch: {
      visible(value) {
        if (value) {
        }else{
          clearInterval(this.interval);
          this.loading = false;
        }
      }
    },
    data() {
      return {
        loading: false,
        otherParams:{
          //根据自己接口要求设置
        },
        xHeaders:{
          //根据自己接口要求设置
        },
        autoUploadVal:this.autoUpload==‘1‘?true:false,
        isChangeFlag:false,
        percentage:0,//加载进度条初始值
        colors:[
          {color: ‘#f56c6c‘, percentage: 20},
          {color: ‘#e6a23c‘, percentage: 40},
          {color: ‘#5cb87a‘, percentage: 60},
          {color: ‘#1989fa‘, percentage: 80},
          {color: ‘#6f7ad3‘, percentage: 100}
        ],
        interval:0,//加载的定时器
        timeStop:0,//加载成功停止的定时器
      }
    },
    methods: {
       submitUpload() {
        let uoloadFilesData = this.$refs.upload.uploadFiles
        if(uoloadFilesData.length == 0){
          let res={
            data:‘‘
          }
          this.$emit(‘submitUploadParent‘,res);
        }else{
          if(uoloadFilesData[0].status === ‘success‘){
            uoloadFilesData[0].data = uoloadFilesData[0].name
            this.$emit(‘submitUploadParent‘,uoloadFilesData[0]);
          }else{
            this.$refs.upload.submit();
          }
        }
      },
      abort(){
        this.$refs.upload.abort();
      },
      //进度条
      onProgress(e, file, v) {
        let that = this;
        let endPro = 95;
        that.loading = true;
        that.interval = setInterval(function () {
          if (that.percentage < endPro) {
            that.percentage++;
          }
        },500)
      },
      beforeUpload(file) {
        const limit = file.size / 1024 / 1024 < this.sizeLimit;
        if (!limit) {
          this.$message.error(`上传的文件小不能超过 ${this.sizeLimit}MB!`);
        }
        if (limit) {
          this.loading = true;
        }
        return limit;
      },
      beforeRemove(file, fileList) {
        return this.$confirm(`确定删除“${ file.name }”?`);
      },
      handleSuccess(res, file, fileList) {
        //上传成功,给个加载100的效果
        let that = this;
        that.percentage = 100;
        clearInterval(that.interval)
        that.timeStop=setTimeout(() => {
          that.loading = false;
          that.percentage=0;
          clearTimeout(that.timeStop)
          //根据实际开发情况处理响应
          if (true) {
            //文件上传成功,返回状态数据
            that.$emit(‘submitUploadParent‘,res);
          } else {
            that.$message.error(res.message || ‘上传失败‘);
          }
        }, 100);
      },
      handleRemove(file, fileList) {
        //删除列表选项,需要停止定时器及相关参数
        clearInterval(this.interval)
        this.percentage = 0;
        this.loading = false;
        this.$emit(‘input‘, fileList);
      },
      handlePreview(file) {
        window.open(file.url);
      }
    },
  }
</script>

<style lang="scss" scoped>
  .drag-upload {
    .drag-upload__icon {
      font-size: 40px;
      line-height: 40px;
      color: var(--theme);
      margin: 0;
    }

    .drag-upload__text {
      line-height: 20px;
      margin-bottom: 6px;
    }

    .drag-upload__tip {
      font-size: 12px;
      line-height: 20px;
      color: $auxiliary-text-color;
    }
  }
</style>

<style lang="scss">
  .drag-upload {
    .el-upload {
      width: 100%;
    }
    .el-upload-dragger {
      width: 100%;
      min-height: 140px;
      height: 100%;
      padding: 20px 1em;
    }
    .el-progress{
      display: none;
    }
    .progress.el-progress{
      display: inline-block;
    }
  }
</style>

原文地址:https://www.cnblogs.com/jiayeyuan/p/12639938.html

时间: 2025-01-08 13:36:04

vue element-ui,上传文件加载进度条显示效果(使用定时器实现源码分享)的相关文章

HTML5 jQuery+FormData 异步上传文件,带进度条

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <link href="../resources/css/common.css" rel="stylesheet" /> <script src="../resources/js/jquery-2.1.4.js"></script> <

EXTJS+ASP.NET上传文件带实时进度条代码

一,文件夹 二,upLoad.cs是继承IHttpModule的类: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Text; using System.IO; using System.Reflection; using System.Globalization; using System.Web.Hosting; /// <summary>

spring mvc + xmlHttpRequest2.0 实现无刷新上传文件,带进度条和剩余时间

1.springmvc支持文件上传,需要在spring-mvc.xml配置文件中加上下面的一段话: <!-- 支持上传文件 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/> 2.下面介绍下XMLHttpRequest2.0 最早,微软在IE 5引进了这个接口.因为它太有用,其

JqueryUploadify上传文件(带进度条)

$(document).ready(function() { $("#specproimg").uploadify({ 'uploader' : '${ctx}/source/uploadify.swf', 'script' : '<%=request.getContextPath()%>/admin/uploadFile.do', //后台处理的请求 'cancelImg' : '${ctx}/source/uploadify-cancel.png', 'folder'

Aws pre-signed URLs 上传文件,带进度显示

注意:YourUrl,就是获取 pre-signed URLs的地址 <input type="file" id="selector" multiple> <button onclick="upload()">Upload</button> <div id="status">No uploads</div> <script src="https://c

HTML5文件加载进度管理

/** * 文件加载进度管理 */ DownloadUtils = function(options){ options = options || {}; this.init(options); }; DownloadUtils.prototype = { init:function(options){ var _this = this; this.url = options.url; var xhr = new XMLHttpRequest(); xhr.open("get", th

Chromium中网页加载进度条研究

1.     Shell.java中有成员变量:mProgressDrawable. 该成员变量在方法:onFinishInflate中被初始化. 在该类中有方法:onLoadProgressChanged,该方法中对进度条的值进行改变,并且对刷新完成事件进行反馈. 2.     上面的这个方法是在cc文件中被调用的. 上面方法对应的cc方法是shell_android.cc文件中的LoadProgressChanged方法. voidShell::LoadProgressChanged(Web

HTML5 CSS3 诱人的实例 : 网页加载进度条的实现,下载进度条等

今天给大家带来一个比较炫的进度条,进度条在一耗时操作上给用户一个比较好的体验,不会让用户觉得在盲目等待,对于没有进度条的长时间等待,用户会任务死机了,毫不犹豫的关掉应用:一般用于下载任务,删除大量任务,网页加载等:如果有使用html5为手机布局的,也可以用于手机中~ 效果图: 1.html结构: <div id="loadBar01" class="loadBar"> <div> <span class="percent&qu

Android开发--------------WebView(二)之WebView的滑动底部顶部监听,加载进度条等设置

整理一下WebView的一些常用设置,滑动监听,让跳转的页面也在WebView里显示,加载进度,获得标题等等 一,滑动监听 滑动监听的话是需要在WebView基础之上在加强一下,因为在WebView没有直接监听滑动的方法,看WebView的源码则会发现有一个 protected void onScrollChanged(int l, int t, int oldl, int oldt) : 这个方法.是受到保护的所以我们无法直接使用,所以我们写一个加强的WebView,利用接口回调. Scrol