美文网首页
上传电子书

上传电子书

作者: jesse28 | 来源:发表于2021-03-10 07:01 被阅读0次

    上传的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.message提示成功,然后在发送this.emit('onSuccess',file)给父组件。

    2.当我们上传之后显示在列表中,然后我们又点击X删除掉,会触发 :on-remove="onRemove"

       onRemove() {
          this.$message({
            message: '电子书删除成功',
            type: 'success'
          })
          this.$emit('onRemove')
        },
    

    当我们删除之后,会message提示删除成功,然后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

    相关文章

      网友评论

          本文标题:上传电子书

          本文链接:https://www.haomeiwen.com/subject/hnalqltx.html