背景:
基于pig-ui进行技术学习,前端采用vue2。在进行Excel上传下载的过程中遇到了需要上传文件同时传递参数的问题,经过修改测试,实现了参数传递。
源码:
修改后的excel.vue如下,该文件封装了el-upload对象,原始代码不支持before-upload。
// 子组件
<template>
<div>
<!-- 导入对话框 -->
<el-dialog
:title="title"
:visible.sync="upload.open"
width="400px"
append-to-body
>
<el-upload
ref="upload"
:limit="1"
accept=".xlsx, .xls"
:headers="headers"
:action="url"
// 此处增加了data参数
:data="params"
:disabled="upload.isUploading"
// 此处增加了before-upload方法
:before-upload="fileBeforeUpload"
:on-progress="handleFileUploadProgress"
:on-success="handleFileSuccess"
:on-error="handleFileError"
:auto-upload="false"
drag
>
<i class="el-icon-upload"></i>
<div class="el-upload__text">
将文件拖到此处,或
<em>点击上传</em>
</div>
<div class="el-upload__tip text-center" slot="tip">
<span>仅允许导入xls、xlsx格式文件。</span>
<el-link
type="primary"
:underline="false"
style="font-size:12px;vertical-align: baseline;"
@click="downExcelTemp"
v-if="tempUrl"
>下载模板
</el-link>
</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>
<!--校验失败错误数据-->
<el-dialog title="校验失败数据" :visible.sync="errorVisible">
<el-table :data="errorData">
<el-table-column
property="lineNum"
label="行号"
width="50"
></el-table-column>
<el-table-column
property="errors"
label="错误描述"
show-overflow-tooltip
>
<template slot-scope="scope">
<el-tag
type="danger"
v-for="error in scope.row.errors"
:key="error"
>{{ error }}
</el-tag
>
</template>
</el-table-column>
</el-table>
</el-dialog>
</div>
</template>
<script>
import store from "@/store";
export default {
name: "ExcelUpload",
components: {},
props: {
url: {
type: String
},
title: {
type: String
},
tempUrl: {
type: String
},
tempName: {
type: String
},
// 子组件增加params属性,父组件使用:params进行声明
params: {
type: Object,
default: {}
},
// 子组件增加beforeUpload事件方法,父组件使用@beforeUpload进行声明
beforeUpload: {
type: Function,
default: function () {
return this.params
}
}
},
data() {
return {
upload: {
open: false,
isUploading: false
},
errorVisible: false,
errorData: []
};
},
computed: {
headers: function () {
return {
Authorization: "Bearer " + store.getters.access_token
};
}
},
methods: {
// 在子组件触发beforeUpload事件的时候,随即调用父组件beforeUpload方法
fileBeforeUpload(file) {
if (this.beforeUpload) {
this.$emit("beforeUpload");
}
console.log(this.params);
},
downExcelTemp() {
this.downBlobFile(this.tempUrl, {}, this.tempName);
},
handleFileUploadProgress() {
this.upload.isUploading = true;
},
handleFileError() {
this.$message.error('上传失败,数据格式不合法!')
this.upload.open = false;
},
handleFileSuccess(response) {
this.upload.isUploading = false;
this.upload.open = false;
this.$refs.upload.clearFiles();
// 校验失败
if (response.code === 1) {
this.$message.error("导入失败,以下数据不合法");
this.errorVisible = true;
this.errorData = response.data;
this.$refs.upload.clearFiles();
} else {
this.$message.success("导入成功");
// 刷新表格
this.$emit("refreshDataList");
}
},
submitFileForm() {
this.$refs.upload.submit();
},
show() {
this.upload.isUploading = false;
this.upload.open = true;
}
}
};
</script>
注意上述文件增加的注释。
案例:
实际使用方法:
// 父组件
<template>
<div class="execution">
<basic-container>
<excel-upload
// 注意此处使用:params.sync进行同步绑定
:params.sync="data"
// 注意此处声明beforeUpload事件
@beforeUpload="beforeUpload"
ref="excelUpload"
title="物料数据导入"
url="/scm/material/excel/upload"
temp-name="物料模板.xlsx"
temp-url="/scm/material/excel/templateDownload"
@refreshDataList="handleRefreshChange"
></excel-upload>
</basic-container>
</div>
</template>
import ExcelUpload from "@/components/upload/excel";
export default {
name: 'material',
components: {ExcelUpload},
data() {
return {
data: {}
}
},
methods: {
// 由子组件的before-upload事件发起对父组件的调用,完成参数赋值
beforeUpload() {
Object.assign(this.data, {
orgId: this.userInfo.orgId
});
},
handleRefreshChange() {
this.getList(this.page);
},
......
}
}
文章比较初级,主要还是基于vue父子组件事件参数传递的方法完成了功能扩展。文章来源:https://www.toymoban.com/news/detail-733141.html
有封装el-upload组件的需求,且需扩展相关事件的可以参考本篇文章。文章来源地址https://www.toymoban.com/news/detail-733141.html
到了这里,关于el-upload封装组件ExcelUpload,支持额外参数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!