element對上傳元件二次封裝,vue上傳下載元件的實現

浩星發表於2020-11-10

前言:

      對element的上傳元件進行二次封裝,讓他可以實現上傳下載功能。

實現效果:

手動上傳,不是自動,選中檔案後可上傳,也可清空選中檔案,單個刪除也是可以的

實現步驟:

1、封裝好的 uploadAndDown.vue原始碼,  引入就好

<template>
      <el-upload
        v-if="Refresh"
        class="upload-demo"
        ref="upload"
        :action="action"
        :headers="headers"
        :multiple="multiple"
        :data="data"
        :name="name"
        :with-credentials="cookieOK"
        :show-file-list="showFileList"
        :drag="drag"
        :accept="accept"
        :list-type="listType"
        :auto-upload="autoUpload"
        :file-list="fileList"
        :disabled="is_disabled"

        :on-preview="handlePreview"
        :on-remove="handleRemove"
        :on-success="handleSuccess"
        :on-error="handleError"
        :on-progress="handleProgress"
        :on-exceed="handleExceed"
        :on-change="onChange"

        :before-upload="beforeUpload"
        :before-remove="beforeRemove"
        :http-request="httpRequest"
        >
        <el-button slot="trigger" type="primary" icon="el-icon-upload2">選取檔案</el-button>
        <el-button style="margin-left: 10px;"
                   type="success"
                   @click="submitUploadSD"
                   :disabled="fileList.length==0"
                   :title="fileList.length==0?'請先選中檔案':''"
                   icon="el-icon-upload">開始上傳</el-button>
        <el-button type="danger"
                   v-if="fileList.length>0"
                   icon="el-icon-delete"
                   @click.stop="clearFiles"
                   title="清空選中檔案"
                   circle></el-button>
        <el-button style="margin-left: 10px;"
                   type="primary"
                   @click.stop="downFile"
                   icon="el-icon-download">下載模板</el-button>

        <!--提示資訊-->
        <div slot="tip" class="el-upload__tip" v-if="tip_text!=''">{{tip_text}}</div>
      </el-upload>

</template>

<script>
  //element的上傳檔案元件
  export default {
    props:{
      /**
       * 自動上傳引數
       * */
      autoUpload:{ // 是否需要選取完自動上傳功能
        type: Boolean,
        default: false
      },
      action:{//上傳的地址
        type: String,
        default: ''
      },
      headers: {//設定上傳的請求頭部
        type:Object,
        default: () => {
          return {}
        }
      },
      data: {//上傳時額外帶的引數
        type:Object,
        default: () => {
          return {}
        }
      },
      name:{//上傳的檔案欄位名
        type: String,
        default: 'file'
      },
      cookieOK:{//支援傳送 cookie 憑證資訊
        type: Boolean,
        default: true
      },
      /**
       * 公共引數
       * */
      showFileList:{//是否顯示已上傳檔案列表
        type: Boolean,
        default: true
      },
      drag:{//是否啟用拖拽上傳
        type: Boolean,
        default: false
      },
      accept:{//接受檔案型別-圖片上傳型別-不同的格式之間以逗號隔開
        type: String,
        // default:'.doc,.docx,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document'
        default: '.xlsx,.xls'
      },
      listType:{ // 檔案列表的型別 - text/picture/picture-card
        type: String,
        default: 'text'
      },
      fileList:{//已上傳的檔案列表,
        type:Array,
        default: () => {
          // { 預設格式
          //   name: 'food.jpeg',
          //   url: 'https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100'
          // }
          return []
        }
      },
      is_disabled:{//是否禁止,true是禁止,false不禁止
        type: Boolean,
        default: false
      },
      multiple:{//是否可以多選
        type: Boolean,
        default: true
      },
      limit:{//最大允許上傳個數
        type: Number,
        default: 30
      },

      tip_text:{//提示資訊
        type: String,
        default: ''
      },
      /**
       * 手動上傳引數
       * */
      needFromUpload:{ // form表單,將上傳的file檔案通過 formUpload  方法傳送出去
        type: Boolean,
        default: false
      },


    },
    watch: {},
    data() {
      return {
        Refresh:true,//強制重新整理
      }
    },
    created() {
    },
    mounted() {
    },
    methods: {
      /**
       * 上傳-預設事件
       * */
      //檔案列表移除檔案時的鉤子
      handleRemove(file, fileList) {
        console.log('當前移除的是'+file);
      },
      //點選檔案列表中已上傳的檔案時的鉤子
      handlePreview(file) {
        console.log('當前點選的是'+file);
      },
      //檔案上傳成功時的鉤子
      handleSuccess(response, file, fileList) {
        console.log('檔案上傳成功');
      },
      //檔案上傳失敗時的鉤子
      handleError(err, file, fileList) {
        console.log('檔案上傳失敗');
      },
      //檔案上傳時的鉤子
      handleProgress(event, file, fileList) {
        console.log(file);
      },
      //檔案超出個數限制時的鉤子
      handleExceed(files, fileList) {
        console.log('檔案超出個數限制');
      },
      //覆蓋預設的上傳行為,可以自定義上傳的實現
      httpRequest(){

      },
      //刪除檔案之前的鉤子,引數為上傳的檔案和檔案列表,若返回 false 或者返回 Promise 且被 reject,則停止刪除。
      beforeRemove(file, fileList) {
        console.log('當前刪除的檔案'+file);
        this.fileList.forEach((item,index)=>{
          if(item == file){
            this.fileList.splice(index,1)
          }
        })
      },

      /**
       * 檔案狀態改變時的鉤子,新增檔案、上傳成功和上傳失敗時都會被呼叫
       */
      onChange(file, fileList) {
        this.fileList = fileList;
        console.log('當前的選中檔案:');
        console.log(fileList);
      },
      /**
       * 上傳檔案之前的鉤子,引數為上傳的檔案,若返回 false 或者返回 Promise 且被 reject,則停止上傳。
       */
      beforeUpload(file) {
          console.log(file);
      },
      /**
       * 上傳-自定義事件
       * */
      submitUpload() {
        this.$refs.upload.submit();
      },
      //清空已上傳的檔案列表(該方法不支援在 before-upload 中呼叫)
      clearFiles(){
        this.$refs.upload.clearFiles();
        this.fileList = [];
      },
      //取消上傳某個檔案
      abortFiles(file){
        this.$refs.upload.abort(file);
      },



      /**
       * 手動上傳點選確認
       * */
      submitUploadSD(){
        let arr = this.fileList;
        let str = {
          fileList:arr
        }
        this.$emit('uploadFile',str);
      },
      /**
       * 下載模板點選
       * */
      downFile(){
        this.$emit('downFile');
      },
      /**
       * 手動重新整理上傳元件
       * */
      RefreshUpload(){
        let arr = this.fileList;
        this.Refresh = false;
        this.$nextTick(()=>{
          this.Refresh = true;
        })
      },

    },
    components: {},
    beforeDestroy() {
    }

  }
</script>

<style lang='scss' scoped>

</style>

2、呼叫方法:

template:

<uploadAndDown class="uploadAndDown" @uploadFile="uploadFile" @downFile="downFile"></uploadAndDown>

js部分: 這裡拿到的是一個陣列,不管增、刪,這個陣列都是對應現在選中了幾個檔案

      /**
       * 上傳
       * */
      uploadFile(str){
        let fileList = str.fileList;
        debugger

      },
      //下載事件
      downFile(){
        console.log('點選下載按鈕');
      },

css部分:

 .uploadAndDown{
    width: 91%;
    padding-right: 1%;
    float: right;
  }

相關api:

Attribute

引數說明型別可選值預設值
action必選引數,上傳的地址string
headers設定上傳的請求頭部object
multiple是否支援多選檔案boolean
data上傳時附帶的額外引數object
name上傳的檔案欄位名stringfile
with-credentials支援傳送 cookie 憑證資訊booleanfalse
show-file-list是否顯示已上傳檔案列表booleantrue
drag是否啟用拖拽上傳booleanfalse
accept接受上傳的檔案型別(thumbnail-mode 模式下此引數無效)string
on-preview點選檔案列表中已上傳的檔案時的鉤子function(file)
on-remove檔案列表移除檔案時的鉤子function(file, fileList)
on-success檔案上傳成功時的鉤子function(response, file, fileList)
on-error檔案上傳失敗時的鉤子function(err, file, fileList)
on-progress檔案上傳時的鉤子function(event, file, fileList)
on-change檔案狀態改變時的鉤子,新增檔案、上傳成功和上傳失敗時都會被呼叫function(file, fileList)
before-upload上傳檔案之前的鉤子,引數為上傳的檔案,若返回 false 或者返回 Promise 且被 reject,則停止上傳。function(file)
before-remove刪除檔案之前的鉤子,引數為上傳的檔案和檔案列表,若返回 false 或者返回 Promise 且被 reject,則停止刪除。function(file, fileList)
list-type檔案列表的型別stringtext/picture/picture-cardtext
auto-upload是否在選取檔案後立即進行上傳booleantrue
file-list上傳的檔案列表, 例如: [{name: 'food.jpg', url: 'https://xxx.cdn.com/xxx.jpg'}]array[]
http-request覆蓋預設的上傳行為,可以自定義上傳的實現function
disabled是否禁用booleanfalse
limit最大允許上傳個數number
on-exceed檔案超出個數限制時的鉤子function(files, fileList)-

Slot

name說明
trigger觸發檔案選擇框的內容
tip提示說明文字

Methods

方法名說明引數
clearFiles清空已上傳的檔案列表(該方法不支援在 before-upload 中呼叫)
abort取消上傳請求( file: fileList 中的 file 物件 )
submit手動上傳檔案列表

 

相關文章