elementUi upload上传达到limit后隐藏upload图标

文章讲述了在项目中使用elementUi的el-upload组件来实现上传控件,限制最多只能上传3张图片。当达到限制时,自动隐藏上传按钮;删除照片后,按钮重新显示。为解决删除动画导致的显示问题,采取了在删除操作中加入1秒延迟的方法来同步更新界面状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如题所述,我们项目要求上传控件最大只允许上传3张。当数量达到的时候,自动隐藏上传按钮控件。而当点击删除之前的照片后,又重新显示上传按钮控件。

这里我们选用了饿了么的elementUi里的el-upload控件作为基础,再添加我们的需求。

主要的templete如下

<el-upload
          ref="uploadRef"
          action="fakeaction"
          :http-request="uploadFile"
          :class="attachmentArray.length >= 3 ? 'hide' : 'show'"
          list-type="picture-card"
          :before-upload="beforeAttachmentUpload"
          :auto-upload="true"
          :limit="limit"
          :on-exceed="handleExceed"
          accept=".jpg,.png,.jpeg"
          >
            <div slot="file" class="upload-item" slot-scope="{file}">
                <div class="upload-img-wrapper">
                    <img class="el-upload-list__item-thumbnail" :src="file.url" @click="handlePictureCardPreview(file)">
                </div>
                <i @click="handleRemove(file)" class="delete-icon"></i>
            </div>
        </el-upload>

而对应的style如下

.hide   {
  position: relative;
  float: left;
  padding-top: 20px;
  padding-left: 23px;
  ::v-deep {
    .el-upload--picture-card {
      display: none;
    }

    .el-upload-list__item {
      border: 0;
      border-radius: 0;
      margin:0 30px 0 0;
    }
  }
}

但是光这样子设置呢,会有些许瑕疵,因为控件本身有删除动画时长,进而使得先出现了第四个按钮,再等删除动画完成后,重新显示了三个控件。

所以,我们就必须在删除操作里,给个响应时长。

 handleRemove(file) {
      // console.log(file);
      const index = this.$refs.uploadRef.uploadFiles.findIndex(e => e.uid === file.uid);
      this.$refs.uploadRef.uploadFiles.splice(index, 1);
      setTimeout(() => {
        this.attachmentArray.splice(index,1);
      }, 1000);
      // console.log(this.attachmentArray,"attachmentArray");
    },

这样子才能完美显示/隐藏按钮。

### ElementUI 自定义文件上传实现方法 #### 使用 Vue 和 Element Plus 实现自定义文件上传功能 为了创建一个更加灵活可控的文件上传组件,可以利用 `el-upload` 组件提供的钩子函数来自定义处理上传逻辑。这允许开发者根据业务需求调整上传行为,比如设置文件类型限制、展示进度条以及提供取消上传等功能。 ```html <template> <div class="upload-demo"> <el-upload ref="upload" :action="url" :on-preview="handlePreview" :on-remove="handleRemove" :before-upload="beforeAvatarUpload" :auto-upload="false" list-type="picture-card" multiple :limit="3" :file-list="fileList" :http-request="customUpload" > <i class="el-icon-plus"></i> </el-upload> <el-button style="margin-left: 10px;" size="small" type="success" @click="submitUpload">上传到服务器</el-button> <!-- 预览对话框 --> <el-dialog :visible.sync="dialogVisible"> <img width="100%" :src="dialogImageUrl" alt /> </el-dialog> </div> </template> <script> export default { data() { return { url: 'https://jsonplaceholder.typicode.com/posts/', fileList: [], dialogImageUrl: '', dialogVisible: false, }; }, methods: { submitUpload() { this.$refs.upload.submit(); }, handleRemove(file, fileList) { console.log(file, fileList); }, handlePreview(file) { this.dialogImageUrl = file.url; this.dialogVisible = true; }, beforeAvatarUpload(file) { const isJPG = file.type === 'image/jpeg'; const isLt2M = file.size / 1024 / 1024 < 2; if (!isJPG) { this.$message.error('上传头像图片只能是 JPG 格式!'); } if (!isLt2M) { this.$message.error('上传头像图片大小不能超过 2MB!'); } return isJPG && isLt2M; }, customUpload(content) { // 这里可以加入自己的上传接口调用逻辑 let formData = new FormData(); formData.append("file", content.file); // 假设使用axios发送请求 axios({ method: "post", url: "/v1/upload", data: formData, headers: { "Content-Type": "multipart/form-data" }, }) .then(function (response) { // 处理响应数据... console.log(response.data); }); } } }; </script> ``` 此代码片段展示了如何通过配置项和事件监听器来定制化文件上传过程[^1]。特别是注意到了几个重要的属性: - **`:action`**: 设置上传地址。 - **`:on-preview`, `:on-remove`**, etc.: 定义当发生特定交互触发的动作。 - **`:before-upload`**: 提供了在实际发起HTTP请求前执行验证的机会。 - **`:http-request`**: 可以用来替代默认的AJAX上传方式,从而完全控制整个上传流程[^4]。 此外,在上述例子中还实现了对文件类型的校验,并且加入了预览图像的功能。对于非图片类文档(如Word、Excel等),可以根据实际情况修改对应的图标显示逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值