上传组件用的比较多,所以搞一个封装起来,其实网上有很多了,但是自己记录一下也挺好的。
一、直接上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>
大概就是这些了。传参的话不需要可以不写。