封装Element UI的 Upload 上传组件

上传组件用的比较多,所以搞一个封装起来,其实网上有很多了,但是自己记录一下也挺好的。

一、直接上Element-Ui的Upload代码

我这里配合一个Dialog弹框使用,用了一个固定的宽度。

    <el-dialog :title="upload.title" :visible.sync="upload.open" width="600px">
      <el-upload
        class="test"
        ref="upload"
        :limit="1"  // 最大允许上传个数
        accept=".xlsx, .xls"   // 允许上传的文件类型
        :headers="upload.headers"   // 设置上传的请求头部,传一个对象
        :action="upload.url"     // 必选参数,上传的地址
        :disabled="upload.isUploading"  // 是否禁用
        :on-progress="handleFileUploadProgress"  // 文件上传时的钩子
        :on-change="showFile"  // 文件状态改变时的钩子,添加文件、上传成功和上传失败时都会被调用
        :data="uploadForm"  // 上传时附带的额外参数,传一个对象
        :on-success="handleFileSuccess"  // 文件上传成功时的钩子
        :auto-upload="false"  // 是否在选取文件后立即进行上传,这个特别重要,意思是:你点击了文件上传,等下还要点击确定或者确认才会上传。传布尔值
        drag  // 是否启用拖拽上传
      >
        <i class="el-icon-upload" />
        <div class="el-upload__text">
          将文件拖到此处,或
          <em>点击上传</em>
        </div>
        <div slot="tip" class="el-upload__tip" style="color:red">提示:仅允许导入“xls”或“xlsx”格式文件!</div>
      </el-upload>
      <div slot="footer" class="dialog-footer">
        <el-button type="primary" @click="submitFileForm">确 定</el-button>
        <el-button @click="upload.open = false">取 消</el-button>
      </div>
    </el-dialog>

其实上面的注释是不能写在组件里面,这里写在里面是为了方便了解一些方法和参数。

二、一些 data 里面的配置

// 引入文件
import {
    
     getToken, getSid } from '@/utils/auth'
      uploadForm: {
    
    
        pch: '',
        pcm: '',
        zdyzt: ''
      },
      upload: {
    
    
        // 是否显示弹出层
        open: false,
        // 弹出层标题
        title: '',
        // 是否禁用上传
        isUploading: false,
        // 设置上传的请求头部
        headers: {
    
    
          uiticket: getToken(),
          sid: getSid() || ''
        },
        // 上传的地址
        url: (process.env.ENV === 'production' ? window.location.host + process.env.VUE_APP_BASE_API : process.env.VUE_APP_BASE_API) + 'xxxxxxxxxxxx'
      },

三、method方法

    // 文件上传中处理
    handleFileUploadProgress(event, file, fileList) {
    
    
      this.upload.isUploading = true
    },
 	// 其实也可以不用,我这里懒,直接复制过来了
    showFile(file) {
    
    
      this.$set(this.uploadForm, 'pcm', file.name.split('.')[0])
    },
    // 文件上传成功处理
    handleFileSuccess(response, file, fileList) {
    
    
      this.upload.open = false
      this.upload.isUploading = false
      this.$refs.upload.clearFiles()  // 清空已上传的文件列表(该方法不支持在 before-upload 中调用)
    },
    // 提交上传文件
    submitFileForm() {
    
    
      this.loading = true
      this.$refs.upload.submit()   // 上传,官方的示例也是这样的,在手动上传的例子那里有。
      this.loading = false
    },

四、样式

<style scoped lang="scss">
.test::v-deep .el-upload-dragger {
    
    
  width: 560px;
}
</style>

大概就是这些了。传参的话不需要可以不写。

猜你喜欢

转载自blog.csdn.net/weixin_45849417/article/details/129209016