vue-cli3.0+element-ui上传组件el-upload的使用


Posted in Javascript onDecember 03, 2018

最近项目中涉及很多文件上传的地方,然后文件上传又有很多限制。比如文件大小限制,文件个数限制,文件类型限制,文件上传后的列表样式自定义,包括上传进度条等问题。下面是我对element-ui的上传组件的一些改造, 点击查看源码。

我是自己维护了一个列表数据,再对这个列表数据进行一些操作,没用组件自带的。先看看我的组件模版

<template>
 <el-upload
  class="upload-demo"
  :limit="limit"
  :action="action"
  :accept="accept"
  :data="data"
  :multiple="multiple"
  :show-file-list="showFileList"
  :on-exceed="handleExceed"
  :with-credentials="withcredentials"
  :before-upload="handleBeforeUpload"
  :on-progress="handleProgress"
  :on-success="handleSuccess"
  :on-error="handleError">
  <el-button size="small" type="primary">上传</el-button>
 </el-upload>
</template>
limit: 限制文件个数
action:文件的上传地址(这里我没有特别封装axios,直接用默认的)
accept:接受上传的文件类型(字符串)
data:上传时附带的额外参数
multiple:多选(布尔类型,我这里设为true,即可以批量上传)
show-file-list:是否显示文件上传列表
with-credentials:是否携带cookie,布尔类型,true表示携带

这是我设置的一些初始值

vue-cli3.0+element-ui上传组件el-upload的使用

下面最重要的就是钩子函数了

vue-cli3.0+element-ui上传组件el-upload的使用

1、handleExceed是文件超出个数限制时的钩子
private handleExceed(files: any, fileList: any) {
  if (fileList.length > 20) {
   this.$message.error('最多允许上传20个文件');
   return false;
  }
 }
2、handleBeforeUpload文件上传前的钩子,可以做一些拦截,return false,则停止上传
private handleBeforeUpload(file: any) {
  // 文件大小限制
  const isLt5M = file.size / 1024 / 1024 < 5;
  if (!isLt5M) {
   this.$message.error('不得超过5M');
   return isLt5M;
  }
  // 文件类型限制
  const name = file.name ? file.name : '';
  const ext = name
   ? name.substr(name.lastIndexOf('.') + 1, name.length)
   : true;
  const isExt = this.accept.indexOf(ext) < 0;
  if (isExt) {
   this.$message.error('请上传正确的格式类型');
   return !isExt;
  }
  // 大小和类型验证都通过后,给自定义的列表中添加需要的数据
  this.objAddItem(this.tempArr, file);
 }
3、handleProgress文件上传时的钩子,更新进度条的值
private handleProgress(event: any, file: any, fileList: any) {
  this.tempArr.forEach((element: any, index: number) => {
   if (element.uid === file.uid) {
    // 更新这个uid下的进度
    const progress = Math.floor(event.percent);
    // 防止上传完接口还没有返回成功值,所以此处给定progress的最大值为99,成功的钩子中再置为100
    element.progress = progress === 100 ? 99 : progress;
    this.$set(this.tempArr, index, element);
    this.$emit('changeFileList', this.tempArr);
   }
  });
 }
4、handleSuccess文件上传成功时的钩子
private handleSuccess(response: any, file: any, fileList: any) {
  this.tempArr.forEach((element: any, index: number) => {
   if (element.uid === file.uid) {
    element.progress = 100;
    // element.url为下载地址,一般后端人员会给你返回
    // 我这边为了做后面的下载,先写死链接供测试
    element.url = 'http://originoo-1.b0.upaiyun.com/freepic/3226433.jpg!freethumb';
    this.$message.success('文件上传成功');
    this.$set(this.tempArr, index, element);
    this.$emit('changeFileList', this.tempArr);
   }
  });
  // response是后端接口返回的数据,可以根据接口返回的数据做一些操作
  // 示例
  // const bizCode = response.rspResult.bizCode;
  // switch (bizCode) {
  //  case 200:
  //   this.tempArr.forEach((element: any, index: number) => {
  //    if (element.uid === file.uid) {
  //     element.progress = 100;
  //     element.url = response.data.url; // 这是后端人员给我返回的下载地址
  //     this.$message.success('文件上传成功');
  //     this.$set(this.tempArr, index, element);
  //     this.$emit('changeFileList', this.tempArr);
  //    }
  //   });
  //   break;
  //  default:
  //   this.tempArr.forEach((element: any, index: number) => {
  //    if (element.uid === file.uid) {
  //     this.tempArr.splice(index, 1); // 上传失败删除该记录
  //     this.$message.error('文件上传失败');
  //     this.$emit('changeFileList', this.tempArr);
  //    }
  //   });
  //   break;
  // }
 }
5、handleError文件上传失败时的钩子
private handleError(err: any, file: any, fileList: any) {
  this.tempArr.forEach((element: any, index: number) => {
   if (element.uid === file.uid) {
    this.tempArr.splice(index, 1); // 上传失败删除该记录
    this.$message.error('文件上传失败');
    this.$emit('changeFileList', this.tempArr);
   }
  });
 }
添加数据函数
private objAddItem(tempArr: any[], file: any) {
  const tempObj = {
   uid: file.uid, // uid用于辨别文件
   originalName: file.name, // 列表显示的文件名
   progress: 0, // 进度条
   code: 200, // 上传状态
  };
  tempArr.push(tempObj);
  this.$emit('changeFileList', tempArr);
 }
上传的文件下载封装
private downloadFileFun(url: any) {
  const iframe: any = document.createElement('iframe') as HTMLIFrameElement;
  iframe.style.display = 'none'; // 防止影响页面
  iframe.style.height = 0; // 防止影响页面
  iframe.src = url;
  document.body.appendChild(iframe); // 这一行必须,iframe挂在到dom树上才会发请求
  // 5分钟之后删除(onload方法对于下载链接不起作用,就先抠脚一下吧)
  setTimeout(() => {
   iframe.remove();
  }, 5 * 60 * 1000);
 }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Knockoutjs快速入门(经典)
Dec 24 Javascript
创建、调用JavaScript对象的方法集锦
Dec 24 Javascript
jQuery实现类似标签风格的导航菜单效果代码
Aug 25 Javascript
JavaScript中的return语句简单介绍
Dec 07 Javascript
灵活的理解JavaScript中的this指向
Feb 25 Javascript
javascript日期比较方法实例分析
Jun 17 Javascript
JavaScript中removeChild 方法开发示例代码
Aug 15 Javascript
JS 实现可停顿的垂直滚动实例代码
Nov 23 Javascript
微信小程序手势操作之单触摸点与多触摸点
Mar 10 Javascript
Angular2.0/4.0 使用Echarts图表的示例代码
Dec 07 Javascript
js正则表达式校验指定字符串的方法
Jul 23 Javascript
vue实现输入一位数字转汉字功能
Dec 13 Javascript
利用jquery和BootStrap实现动态滚动条效果
Dec 03 #jQuery
微信小程序实现页面下拉刷新和上拉加载功能详解
Dec 03 #Javascript
微信小程序在地图选择地址并返回经纬度简单示例
Dec 03 #Javascript
vue.js实现的全选与全不选功能示例【基于elementui】
Dec 03 #Javascript
创建Vue项目以及引入Iview的方法示例
Dec 03 #Javascript
利用Vue构造器创建Form组件的通用解决方法
Dec 03 #Javascript
swiper.js插件实现pc端文本上下滑动功能示例
Dec 03 #Javascript
You might like
php数组函数序列之ksort()对数组的元素键名进行升序排序,保持索引关系
2011/11/02 PHP
探讨:如何编写PHP扩展
2013/06/13 PHP
PHP实现的封装验证码类详解
2013/06/18 PHP
PHP生成图像验证码的方法小结(2种方法)
2016/07/18 PHP
Yii2.0 Basic代码中路由链接被转义的处理方法
2016/09/21 PHP
Laravel服务容器绑定的几种方法总结
2020/06/14 PHP
javascript实现的动态添加表单元素input,button等(appendChild)
2007/11/24 Javascript
JavaScript 节点操作 以及DOMDocument属性和方法
2007/12/06 Javascript
javascript中的作用域scope介绍
2010/12/28 Javascript
基于jquery的返回顶部效果(兼容IE6)
2011/01/17 Javascript
让AJAX不依赖后端接口实现方案
2012/12/03 Javascript
node.js中Socket.IO的进阶使用技巧
2014/11/04 Javascript
jquery复选框多选赋值给文本框的方法
2015/01/27 Javascript
AngularJS基础学习笔记之指令
2015/05/10 Javascript
简介alert()与console.log()的不同
2015/08/26 Javascript
JS使用post提交的两种方式
2015/12/03 Javascript
JavaScript Date对象详解
2016/03/01 Javascript
js判断传入时间和当前时间大小实例(超简单)
2018/01/11 Javascript
详解React中setState回调函数
2018/06/14 Javascript
Vue使用NPM方式搭建项目
2018/10/25 Javascript
在vue中使用Echarts利用watch做动态数据渲染操作
2020/07/20 Javascript
简单谈谈Python中的反转字符串问题
2016/10/24 Python
基于Linux系统中python matplotlib画图的中文显示问题的解决方法
2017/06/15 Python
python使用super()出现错误解决办法
2017/08/14 Python
Python绘制3D图形
2018/05/03 Python
详解python 注释、变量、类型
2018/08/10 Python
Anaconda之conda常用命令介绍(安装、更新、删除)
2019/10/06 Python
python 项目目录结构设置
2020/02/14 Python
纯CSS3实现滚动的齿轮动画效果
2014/06/05 HTML / CSS
CSS3 filter(滤镜)实现网页灰色或者黑色模式的示例代码
2021/02/24 HTML / CSS
墨西哥皇宫度假村预订:Palace Resorts
2018/06/16 全球购物
高中语文课后反思
2014/04/27 职场文书
党员批评与自我批评发言材料
2014/10/14 职场文书
2014年后勤管理工作总结
2014/12/01 职场文书
大学生考试作弊被抓检讨书
2014/12/27 职场文书
2015年药店工作总结
2015/04/20 职场文书