在VUE项目中使用了element的upload上传图片组件
要求

  1. 只能上传jpg / png格式
  2. 图片大小不能超过2M
  3. 图片像素要大于600*400
  4. 图片数量达到上限的时候隐藏上传的框框

模板html

<template>
<div>
<el-upload 
  action = "#"                               //上传的地址,必填
  list-type = "picture-card"                 //文件列表类型,text/picture/picture-card
  :class = "{disabled:isMax}"                //动态绑定class,(此处是隐藏上传框的关键)
  :limit = 3                                 //限制上传图片的数量
  :on-success = "success"                    //文件上传成功的钩子
  :on-error = "error"                        //文件上传失败的钩子
  :on-change = "change"                      //文件状态改变的钩子
  :on-progress = "progress"                  //文件上传时候的钩子 
  :on-remove = "remove"                      //文件移除的钩子
  :before-upload = "beforeAvatarUpload">     //文件上传前的钩子
  <i class="el-icon-upload"></i>           
  <div class="el-upload__text">封面</div>
</el-upload>
</div>
</template>

一、限制图片尺寸、格式、大小

:before-upload的钩子里限制

beforeAvatarUpload:function(file){
      const isJPG = file.type === 'image/jpeg';
      const isPNG = file.type === 'image/png';
      const isPG = (isJPG || isPNG)                                       //限制图片格式为jpg / png
      const isLt2M = file.size / 1024 / 1024 < 2;                         //限制图片大小
      const isSize = new Promise(function(resolve,reject) {
          let width = 600
          let height = 400
          let _URL = window.URL || window.webkitURL
          let img = new Image()
          img.onload = function() {
              let valid = img.width >= width && img.height >= height
              valid ? resolve() : reject();
          }
          img.src = _URL.createObjectURL(file)
      }).then(() => {
          return file;
      },()=>{
          this.$message.error('上传图片像素要大于600*400!');
          return promise.reject();
      })
      if (!isPG) {
          this.$message.error('上传头像图片只能是 JPG 或 PNG 格式!');
      }
      if (!isLt2M) {
          this.$message.error('上传头像图片大小不能超过 2MB!');
      }
        return isPG && isLt2M && isSize
    }
  }

1). window.URL(/window.webkitURL)window对象,将blob或file读取成一个url
格式:

window.URL.createObjectURL(file / blob)
window.webkitURL.createObjectURL(file / blob)

2). image.onload():image对象的onload事件,当图片加载完成后执行的函数

二、限制上传图片数量

upload有一个:limit参数属性以及on-exceed文件超出个数限制的钩子

<el-upload 
  action = "#"
  list-type = "picture-card"
  :limit = 3
  :on-exceed = "exceed">
  <i class="el-icon-upload"></i>
  <div class="el-upload__text">封面</div>
</el-upload>

exceed:function(){
   this.$message.error('最多只能上传3张图片')
},

通过这种方式可以限制用户上传图片的数量但是用户体验不佳,当图片数量达到上限的时候上传图片的框框还在,所以下面就用另外一种方法,当图片数量达到上限之后隐藏上传的框。
在这里插入图片描述

三、隐藏上传框

在这里插入图片描述
先是看到DOM结构可以知道我们要隐藏的是下面的空白上传框
在这里插入图片描述
1.) 动态绑定class:

<el-upload 
    :class = "{disabled:isMax}"
    :on-change = "change"
    :on-remove = "remove"
    :on-error = "error">
</el-upload>

2.) 在data中初始化isMax

data() {
    return {
      isMax : false,
    };
 },
 

3.) 在图片上传(改变) / 删除的时候判断isMax

change:function(file,fileList){
      console.log('change')
      if(fileList.length >= 3){
        this.isMax = true
      }
  },
  remove:function(file,fileList){
      console.log('remove')
      if(fileList.length < 3){
        this.isMax = false
      }
  },
//上传失败的时候会出现Bug,故在上传失败的时候也进行一下判断
error:function(err, file, fileList){
      this.$message.error('上传失败')
      if(fileList.length >= 3){
        this.isMax = true
      }else{
        this.isMax = false
      }
  },
.disabled .el-upload--picture-card{
    display: none
}

当只选择.disabled的时候发现所有都会被隐藏,即disabled是加在整个的div上的,于是加一个.el-upload--picture-card精确到空白上传框上

GitHub 加速计划 / eleme / element
54.06 K
14.63 K
下载
A Vue.js 2.0 UI Toolkit for Web
最近提交(Master分支:3 个月前 )
c345bb45 7 个月前
a07f3a59 * Update transition.md * Update table.md * Update transition.md * Update table.md * Update transition.md * Update table.md * Update table.md * Update transition.md * Update popover.md 7 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐