elementPlus 二次封装 el-upload

此案例是区分上传的文件还是图片;
在这里插入图片描述

需要注意的是 before-upload 事件,如果是返回了 false,也会默认走on-remove,需要在 remove事件里做file 的状态判断。

<template>
  <el-upload class="upload-box" ref="uploadImgRef" :file-list="fileList" action="#"
  	:before-upload="onBeforeUploadImage"
    :http-request="uploadAction" :auto-upload="true" :list-type="listType"
    :on-remove="handleRmove"
    :on-preview="handlePictureCardPreview">
    <el-icon v-if="listType === 'picture-card'">
      <Plus />
    </el-icon>
    <el-button v-else type="primary">选择文件</el-button>
  </el-upload>

  <el-dialog v-model="dialogVisible">
    <img style="width: 100%" w-full :src="dialogImageUrl" />
  </el-dialog>
</template>
<script>
import { uploadFile } from '@/api/common';
const PIC_TYPE = 'picture-card'; // 图片格式
  export default {
    props: {
      listType: { // 已上传文件展示格式
        type: String,
        default: 'text'
      },
      fileList: { // 已上传文件列表
        type: Array,
        default: () => []
      },
      fileType: { // 上传文件的格式限制,以逗号分割的字符串,如图片:image/jpeg,image/jpg,image/png
        type: String,
        default: ''
      }
      // 如果还要限制上传的数量,也可匹配;上传之前先检查已有的数量,再进行上传;limit: 10
    },
    emits: ['changeFile'],
    computed: {
      uploadFileType () {
        return this.listType === PIC_TYPE ? 'Img': 'File';
      }
    },
    data () {
      return {
        dialogImageUrl: '',
        dialogVisible: false,
        uploadFileList: []
      }
    },
    mounted () {
      this.uploadFileList = [...this.fileList];
    },
    watch: {
      fileList(val) {
        this.uploadFileList = val
      },
    },
    methods: {

      handlePictureCardPreview (uploadFile) {
        if (this.listType === PIC_TYPE) {
          this.dialogImageUrl = uploadFile.url
          this.dialogVisible = true
        }
      },
      // 上传请求
      async uploadAction (option) {
        try {
          console.log(option, 'option')
          const res = await uploadFile({ file: option.file, fileType: this.uploadFileType });
          const url = res.data.url;
          const name = option.file.name;
          this.uploadFileList.push({url, name});
          this.$emit('changeFile', this.uploadFileType, [...this.uploadFileList]);
        } catch (error) {
          console.log(error)
        }
      },

      onBeforeUploadImage (file) {
        if (!this.fileType) return true;
        const isRightType = this.isRightType(file.type);
        if (!isRightType) {
          this.$message.error(`上传文件格式错误! 请上传 ${this.fileType} 格式文件`)
        }
        return isRightType;
      },

      handleRmove (file, fileList) {
        if (file.status == 'success') {
          // 删除后改变某些状态的代码
          console.log('remove =========');
          const index = this.uploadFileList.findIndex((item) => item.uid === file.uid);
          this.uploadFileList.splice(index, 1);
          this.$emit('changeFile', this.uploadFileType, [...this.uploadFileList]);
        }
        if (file.status == 'ready') {
         // 这里应该就是before-upload中返回false时的状况了,还有没有别的状况,未知
    	}        
      },

      isRightType (type) {
        let isRight = this.fileType.split(',').includes(type);
        return isRight;
      }
    }
  }
</script>
<style lang="scss" scoped>
.upload-box {
  width: 100%;
}
</style>
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现二次封装el-upload并回显多个图片,你可以按照以下步骤进行: 1. 在el-upload组件的基础上封装一个新组件,并命名为MultiUpload。 2. 在MultiUpload组件中,添加一个data属性,用于存储已上传的图片路径数组。 3. 在el-upload组件中,添加一个success事件处理函数。在该函数中,将上传成功的图片路径添加到data属性中保存。 4. 在MultiUpload组件中,添加一个template模板。该模板中,可以使用v-for指令遍历data属性中的图片路径数组,并将每个图片路径渲染到页面上。 下面是一个简单的MultiUpload组件示例代码: ``` <template> <el-upload action="/upload" :on-success="handleSuccess" multiple :show-file-list="false"> <el-button type="primary">点击上传</el-button> </el-upload> <div v-for="url in imageUrlList" :key="url"> <img :src="url" alt="uploaded image" style="max-width: 100%;"> </div> </template> <script> export default { data() { return { imageUrlList: [] } }, methods: { handleSuccess(response, file, fileList) { this.imageUrlList.push(response.url) } } } </script> ``` 在这个示例代码中,MultiUpload组件使用了element-ui中的el-upload组件,并通过v-for指令遍历了imageUrlList数组中的图片路径,并将每个图片路径渲染到页面上。在handleSuccess方法中,将上传成功的图片路径添加到imageUrlList数组中保存。 使用这个二次封装的MultiUpload组件时,只需要像使用el-upload组件一样使用即可。例如: ``` <multi-upload></multi-upload> ``` 这里没有传递任何属性或事件处理函数,因为MultiUpload组件中已经处理了所有必要的逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值