第一次用element ui,本人简略写了一个上传组件
1.BaseUpload.vue

<template>  <el-dialog    v-if="isDialog"    :visible="visible"    :title="title"    :width="width"    :before-close="beforeClose"    class="upload-dialog"  >    <el-upload class="upload-demo" drag action="#" :http-request="handleRequest" multiple>      <i class="el-icon-upload"></i>      <div class="el-upload__text">        <slot name="upload-operation-tips">          将文件拖到此处,或          <em>点击上传</em>        </slot>      </div>      <div class="el-upload__tip" slot="tip">        <slot name="template-download">请参照模板上传</slot>      </div>      <div class="process_container" v-if="isProcessVisible">        <el-progress :type="type" :percentage="percentage" :status="status"></el-progress>      </div>    </el-upload>  </el-dialog></template><script>import { upload } from "../../api/upload";export default {  props: {    visible: {      type: Boolean,      default: false,    },    title: "",    actions: "",    width: "50%",  },  data() {    return {      type: "circle",      percentage: 0,      isProcessVisible: false,      status: null,      isDialog: false,    };  },  methods: {    beforeClose() {      this.isDialog = false;      this.$emit("update:visible", false);    },    init() {      this.isDialog = true;      this.isProcessVisible = false;      this.percentage = 0;      this.status = null;    },    handleRequest(param) {      let fileObj = param.file;      let form = new FormData();      form.append("file", fileObj);      this.isProcessVisible = true;      upload(this.actions, form, this.uploadProcess).then((res) => {        this.$emit("upload-callback", res);        this.beforeClose();      });      return false; // 返回false不会主动上传    },    uploadProcess(pencent) {      this.percentage = parseInt(pencent);      if (pencent == 100) {        this.status = "success";      }    },  },  watch: {    visible: {      handler(val) {        if (val) {          this.init();        }      },      immediate: true,    },  },};</script><style scoped>.upload-dialog {  text-align: center;}.upload-demo .el-upload-dragger {  width: 100%;}.process_container {  position: absolute;  top: 0px;  left: 0px;  width: 100%;  height: -webkit-fill-available;  background: white;  display: flex;  align-items: center;  align-content: space-between;  justify-content: center;}</style><style >.upload-dialog .el-dialog {  min-width: fit-content;}</style>

2.axios 代码

  let data = await axiosInstance.post(url, params, {      headers: { "Content-Type": "multipart/form-data" },      timeout: uploadTimeout,      onUploadProgress: progressEvent => {        let progressPercent = (progressEvent.loaded / progressEvent.total * 100);        callback(progressPercent);      }    }).catch(e => {      return e;    });    return data;  }