el-upload上传图片必填提示,超出最大数量不展示上传按钮

因为在不同的项目中经常看到关于upload不同的写法,今天做一下记录,方便以后使用。

一、el-upload设置必填

需求描述

提交表单的时候,图片作为必填项,如果没有上传,提示信息和输入框单选框一样,在表单相关字段下进行提示,而不是通过message提示(如下图)。


message提示.jpg

实现步骤

  1. 提交表单的时候,el-upload作为一个表单项,在rules里面加上校验
    需要注意的是,因为不会直接进行绑定,上传成功以及删除都需要赋值到对应的字段
<el-form ref="editForm" :model="editForm" :rules="rules" label-width="60px">
  <el-form-item label="照片:" prop="afterList">
    <el-upload
      list-type="picture-card"
      :action="uploadImgUrl"
      :headers="headers"
      :file-list="editForm.afterList"
      multiple
      :limit="5"
      :on-success="handleImgSuccess"
      :on-preview="handleImgPreview"
      :on-remove="handleImgRemove"
      :before-upload="beforeImgUpload"
      accept="image/*"
    >
      <i slot="default" class="el-icon-plus"></i>
    </el-upload>
  </el-form-item>
</el-form>

一些关于Upload 上传所用到字段的简单解释

参数 说明
list-type 文件列表的类型,可选 picture-card是照片墙
action 图片上传地址
headers 请求头
file-list 上传展示的文件列表, show-file-list为true时才会展示
multiple 支持多选
limit 最大允许上传个数
accept 接受上传的文件类型
on-success 文件上传成功时的钩子 成功
on-preview 点击文件列表中已上传的文件时的钩子 预览
on-remove 文件列表移除文件时的钩子 删除
before-upload 上传文件之前的钩子,参数为上传的文件,若返回 false 或者返回 Promise 且被 reject,则停止上传。 校验
  1. rules设置,无论是规则名称还是字段名称都要保持一致
rules: {
  afterList: [
    { required: true, message: "照片不能为空", trigger: "change" },
  ],
}
  1. 上传成功之后必须进行赋值操作,否则虽然页面看起来展示成功了,但是并没有进入到设置的字段中。

因为把新增修改写在了一个弹窗里,所以代码在赋值的时候判断了url的取值。
新增的地址为item.response.url,修改的地址为item.url(回显的时候赋值在了这个字段)。
如果只是新增不涉及修改,可以不用判断url取值,直接写成 return item.response.url即可。

handleImgSuccess(res, file, fileList) {
  this.editForm.afterList = fileList.map(item=>{
    let url = '';
    if (item.response && item.response.url) {
      url = item.response.url;
    } else {
      url = item.url;
    }
    return url;
  });
},
  1. 同样,删除之后也需要重新赋值,否则虽然页面看起来没有了,但是字段中设置的内容并没有发生改变。

新增修改在一个弹窗,所以删除的图片既可能是数据库已有的也可能是修改时新增还没有提交的。地址和上传成功获取一样。

handleImgRemove(file, fileList) {
  this.editForm.afterList = fileList.map(item=>{
    let url = '';
    if (item.response && item.response.url) {
      url = item.response.url;
    } else {
      url = item.url;
    }
    return url;
  });
},

完成效果

设置完成之后,必填提示如下


必填提示.jpg

二、超出最大数量不展示上传按钮

需求描述

使用upload上传时,默认后面的上传按钮永远存在,如下图所示。

上传.jpg

达到最大允许上传数之后,不再显示此上传按钮。

实现思路

通过浏览器调试找到上传按钮的类名,为el-upload--picture-card。通过修改这个类的样式隐藏上传按钮。

调试.png

具体步骤

  1. 在upload标签上先绑定一个类名:class="{hide:hideUpload}"。当hideUpload为true时,hide样式生效,上传按钮隐藏。data中设置hideUpload默认为false,显示上传按钮。

  2. 修改Element UI中标签的样式,使用深度选择器强制修改。
    类名前加上/deep/,>>>或::v-deep;需要用在有 scoped 属性的 style 标签中。

<style scoped>
.hide /deep/ .el-upload--picture-card {
  display: none;
}
</style>
  1. 在el-upload中绑定一个on-change事件,添加文件、上传成功和上传失败时都会被调用。
//绑定事件  :on-change="handleImgChange"
handleImgChange (file, fileList) {
  this.hideUpload = fileList.length >= 1; //1为设置的最大允许上传数
},
  1. on-change事件在文件移除时不会被触发,因此我们需要在on-remove移除事件再进行一次判断或者手动触发on-change事件,二选一即可。
//绑定事件:on-change="handleImgChange"
handleImgRemove (file, fileList) {
  this.hideUpload = fileList.length >= 1; //1为设置的最大允许上传数
  // this.handleImgChange(file, fileList); //手动触发
},

完成效果

设置最大上传数为1,最终效果图如下


效果.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容