上传的upload组件
<template>
<div class="upload-container">
<el-upload
:action="action"
:headers="headers"
:multiple="false"
:limit="1"
:before-upload="beforeUpload"
:on-success="onSuccess"
:on-error="onError"
:on-remove="onRemove"
:file-list="fileList" //这个是文件列表,用在编辑的时候,回显用的,fileList是从父组件传过来的
:on-exceed="onExceed"
:disabled="disabled" //这个也是从父组件传过来的,如下面的props
drag
show-file-list
accept="application/epub+zip"
class="image-upload"
>
<i class="el-icon-upload" />
<div v-if="fileList.length === 0" class="el-upload__text">
请将电子书拖入或 <em>点击上传</em>
</div>
<div v-else class="el-upload__text">图书已上传</div>
</el-upload>
</div>
</template>
<script>
import { getToken } from '../../utils/auth' //从cookie获取token
export default {
props: {
fileList: {
type: Array,
default() {
return []
}
},
disabled: {
type: Boolean,
default: false
}
},
data() {
return {
action: `${process.env.VUE_APP_BASE_API}/book/upload`
}
},
computed: {
headers() {
return {
Authorization: `Bearer ${getToken()}`//1.需要定义header,而且登录的时候要带上token,防止没有登录的人上传一些乱的文件
}
}
},
methods: {
beforeUpload(file) {
this.$emit('beforeUpload', file) //这个方法具体做的是调动父组件传入的一个事件
},
onSuccess(response, file) { //成功时候执行的操作
console.log(response, file)
const { code, msg, data } = response
if (code === 0) {
this.$message({
message: msg,
type: 'success'
})
this.$emit('onSuccess', data)
} else {
this.$message({
message: (msg && `上传失败,失败原因:${msg}`) || '上传失败',
type: 'error'
})
this.$emit('onError', file)
}
},
onError(err) {
const errMsg = err.message && JSON.parse(err.message)
this.$message({
message: (errMsg && errMsg.msg && `上传失败,失败原因:${errMsg.msg}`) || '上传失败',
type: 'error'
})
this.$emit('onError', err)
},
onRemove() {
this.$message({
message: '电子书删除成功',
type: 'success'
})
this.$emit('onRemove')
},
onExceed() { //文件超出个数限制时的钩子
this.$message({
message: '每次只能上传一本电子书',
type: 'warning'
})
}
}
}
</script>
<style lang="scss" scoped>
</style>
1.当我们上传成功之后:on-success="onSuccess"执行onSuccess这个方法。
onSuccess(response, file) {
console.log(response, file)
const { code, msg, data } = response
if (code === 0) {
this.$message({
message: msg,
type: 'success'
})
this.$emit('onSuccess', data)
} else {
this.$message({
message: (msg && `上传失败,失败原因:${msg}`) || '上传失败',
type: 'error'
})
this.$emit('onError', file)
}
},
如上代码,当上传成功之后,我们给他一个this.emit('onSuccess',file)给父组件。
2.当我们上传之后显示在列表中,然后我们又点击X删除掉,会触发 :on-remove="onRemove"
onRemove() {
this.$message({
message: '电子书删除成功',
type: 'success'
})
this.$emit('onRemove')
},
当我们删除之后,会emit发送事件直接传给父组件,让父组件去处理这个onRemove事件。
3.当我们上传一本电子书之后,然后再去上传一本,会触发onExceed方法。on-exceed 文件超出个数限制时的钩子
onExceed() { //文件超出个数限制时的钩子
this.$message({
message: '每次只能上传一本电子书',
type: 'warning'
})
}
4.上面我们都是写上传组件【子组件】的内容,现在我们要在父组件调用下。
image.png
<el-col :span="24">
<ebook-upload
:file-list="fileList"
:disabled="isEdit"
@onSuccess="onUploadSuccess"
@onRemove="onUploadRemove"
/>
</el-col>
在我们在父组件中引入刚才我们封装的子组件<ebook-upload>,我们绑定了一个:file-list = "fileList"。这个fileList我们需要在父组件的data里面定义一下,默认是一个空的数组。主要用途是在编辑的时候,上传获取到的电子书放到这个fileList数组当中。
data() {
return {
loading: false,
postForm: {},
fileList: [],
},
5.在ebook
网友评论