// 单文件上传及展示 <template> <div class="my-upload"> <label> <el-button icon="el-icon-upload" size="mini" :loading="loading">{{ loading ? "上传中..." : tip }}</el-button> <input type="file" @change="chooseFile" :disabled="loading" ref="referenceUpload" /> </label> <div v-if="value" class="flex"> <div style="margin-right: 20px"> <div v-if="type === 'thumb'" class="thumb" :style="imgCover"></div> <div v-else>文件名: {{ value }}</div> </div> <!-- <div> <el-button icon="el-icon-delete" size='mini' plain @click='del'>删除</el-button> </div>--> </div> </div> </template> <script> export default { props: { value: { type: String, default: "", }, type: { // 展示类型,文件名或缩略图 filename | thumb type: String, default: "filename", }, tip: { // 按钮文字 type: String, default: "上传文件", }, prePath: { type: String, default: "", }, }, methods: { del() { this.$emit("input", ""); }, async chooseFile(e) { this.loading = true; try { const { code, url } = await this.$upload("file/upload", { uploadFile: e.target.files[0], prePath: this.prePath, }); if (code === 1) { this.$emit("input", url); } else { this.$message.error("上传文件失败"); } } catch (error) { this.$message.error(error.message); } this.loading = false; this.$refs.referenceUpload.value = null; }, }, computed: { imgCover() { return `background-image: url(${this.value})`; }, }, data() { return { loading: false, }; }, }; </script> <style lang="less"> .my-upload { label { position: relative; input { display: block; position: absolute; width: 100%; height: 100%; left: 0; top: 0; opacity: 0; } } .thumb { width: 80px; height: 80px; background-size: contain; background-position: center center; background-repeat: no-repeat; border: 1px solid #ccc; border-radius: 5px; overflow: hidden; } p { color: #666; font-size: 14px; } } </style>