element-ui el-upload組件實(shí)現(xiàn)點(diǎn)擊按鈕后傳到后臺(tái)

組件再好看,功能在美好,也要按照需求來(lái),哎打工人就是這樣咯!
今天介紹一下element-ui的上傳頭像組件 el-upload,官方示例如下:

image.png

非常簡(jiǎn)潔方便,里面使用到的屬性主要有
actionbefore-upload
實(shí)現(xiàn)很簡(jiǎn)單,就是點(diǎn)擊 + 號(hào)然后選擇圖片,確認(rèn)之后,直接調(diào)用action的地址上傳到服務(wù)器。before-upload可以在上傳到服務(wù)器之前對(duì)圖片進(jìn)行格式限制。官方就是這么用的。

需求:
但是本次我是想實(shí)現(xiàn),加多一個(gè)按鈕上傳,我點(diǎn)擊+號(hào)之后圖片只是顯示在圖片框中,等我點(diǎn)擊上傳按鈕的時(shí)候,再執(zhí)行axios,這樣也方便能被我的攔截器攔截到,進(jìn)行一些header頭的處理。
沒(méi)辦法只能自己重新處理一下。還好element官方提供了許多el-upload組件聲明周期的屬性,通過(guò)屬性綁定對(duì)應(yīng)的方法,基本足夠自定義上傳邏輯了。

下面是代碼:
我是直接將封裝成一個(gè)組件了,也方便以后其他地方可以用到,直接cv,你懂的!
效果:

image.png

components/uploadAvatar/index.vue
1、先放結(jié)構(gòu)

<template>
  <div class="">
    <div class="upload-dialog-content">
        <div class="upload-picture-area">
          <el-upload
            ref="upload"
            action=""
            class="avatar-uploader"
            :http-request="handleUploadAvatar"
            :show-file-list="false"
            :before-upload="beforeAvatarUpload"
            :auto-upload="false"
            :on-change="displayAvatar">
            <img v-if="imageUrl" :src="imageUrl" class="avatar">
            <i v-else class="el-icon-plus avatar-uploader-icon"></i>
          </el-upload>
        </div>
        <div class="upload-button-area">
          <el-button style="margin-left: 10px;" size="small" type="success" @click="submitUpload">上傳到服務(wù)器</el-button>
        </div>
      </div>
  </div>
</template>

2、script

<script>
export default {
  //import引入的組件需要注入到對(duì)象中才能使用
  name:'UploadAvatar',
  props: [], // 父組件向該組件傳遞過(guò)來(lái)的參數(shù),用props接收
  data() {
    //這里存放數(shù)據(jù)
    return {
      imageUrl:'',
    };
  },
  //監(jiān)聽(tīng)屬性 類(lèi)似于data概念
  computed: {},
  //監(jiān)控data中的數(shù)據(jù)變化
  watch: {},
  //方法集合
  methods: {
    //在上傳到服務(wù)器之前執(zhí)行
    beforeAvatarUpload(file) {
      const isJPG = file.type === 'image/jpeg';
      const isLt2M = file.size / 1024 / 1024 < 2;

      if (!isJPG) {
        this.$message.error('上傳頭像圖片只能是 JPG 格式!');
      }
      if (!isLt2M) {
        this.$message.error('上傳頭像圖片大小不能超過(guò) 2MB!');
      }
      return isJPG && isLt2M;
    },
    // on-change屬性方法,用于將圖片從本地傳到前端,獲取到圖片,回顯到顯示框中
    displayAvatar(file){
      this.imageUrl = URL.createObjectURL(file.raw);
    },
    // http-request覆蓋默認(rèn)的上傳行為,可以自定義上傳的實(shí)現(xiàn)
    // 在調(diào)用submit的方法時(shí),因?yàn)榉椒ㄒ呀?jīng)被重寫(xiě),會(huì)自動(dòng)觸發(fā)http-request所綁定的方法,從而獲取到file對(duì)象
    handleUploadAvatar(file){
      // 當(dāng)調(diào)用this.$refs.upload.submit();的時(shí)候會(huì)走到http-request屬性綁定的方法,就是該方法,這時(shí)候需要出發(fā)父組件監(jiān)聽(tīng)的uploadAvatarSubmit方法。將圖片對(duì)象傳出去,這步很重要。
      bus.$emit('uploadAvatarSubmit', file);
    },
    //點(diǎn)擊上傳到服務(wù)器按鈕
    submitUpload(){
      this.$refs.upload.submit();
    }
  },
};
</script>

3、style

<style lang='scss' scoped>
.upload-dialog-content{
    display: flex;
    justify-content: space-between;
    flex-direction: column;
    align-items: center;
    .upload-picture-area{
      flex: 3;
      margin-bottom: 10px;
    }
    .upload-button-area{
      flex: 1;
    }
}
</style>

<style>
.avatar-uploader .el-upload {
    border: 1px dashed #d9d9d9;
    border-radius: 6px;
    cursor: pointer;
    position: relative;
    overflow: hidden;
  }
  .avatar-uploader .el-upload:hover {
    border-color: #409EFF;
  }
  .avatar-uploader-icon {
    font-size: 28px;
    color: #8c939d;
    width: 178px;
    height: 178px;
    line-height: 178px;
    text-align: center;
  }
  .avatar {
    width: 178px;
    height: 178px;
    display: block;
  }
</style>

官方是通過(guò)submit方法 走action地址直接請(qǐng)求上傳圖片,我這里使用了http-request 覆蓋了默認(rèn)的行為,也就是說(shuō),當(dāng)你調(diào)用this->$refs->upload->submi()的時(shí)候,就會(huì)走http-request屬性綁定的方法,這時(shí)候只需要在該方法里面寫(xiě)你的邏輯就好。

父組件使用:
1、結(jié)構(gòu)

<template>
  <div>
    ......
    <!-- 上傳頭像 -->
    <el-dialog title="上傳頭像" :visible.sync="uploadFormVisible" width="20%" center>
      <upload-avatar />
    </el-dialog>
  </div>
    ......
</template>

2、script

<script>
//1引入子組件
import uploadAvatar from '@/components/uploadAvatar'
export default {
  components:{ uploadAvatar },//2掛載
  data() {
    return {
      size:60,
      uploadFormVisible:false,
      fit:'fill',
    }
  },
  mounted(){
    // 這里需要注冊(cè)監(jiān)聽(tīng) uploadAvatarSubmit方法,子組件已經(jīng)使用$emit來(lái)觸發(fā)了 
    bus.$on('uploadAvatarSubmit', data=>{
      this.uploadAvatarSubmit(data);
    })
  },
  methods: {
    //上傳頭像打開(kāi)
    uploadAvatar(){
      this.uploadFormVisible = true
    },
    //將圖片上傳到后端
    uploadAvatarSubmit(file){
      //從組件傳遞過(guò)來(lái)的file對(duì)象已經(jīng)獲取到,只需要按照自己希望的格式傳給后端就行。此處執(zhí)行自己的處理邏輯
      const fileObj = file.file
      const form = new FormData()
      form.append('imageFile',fileObj)
      //這里我需要使用formData格式,你們隨意
      _uploadAdminUserAvatar(form).then( res => {
        if (res.code == 0) {
          this.uploadFormVisible = false
          this.$message.success(res.msg)
          //因?yàn)槲翼?xiàng)目里用了vuex  所以我在這里上傳完頭像之后 重新去后端獲取頭像的url,就會(huì)自動(dòng)刷新我的頭像為新上傳的圖片了
          this.$store.dispatch('user/getInfo')
        } else {
          this.$message.error(res.msg)
        }
      })
    },
  }
}
</script>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,967評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,273評(píng)論 3 415
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 175,870評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 62,742評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,527評(píng)論 6 407
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,010評(píng)論 1 322
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,108評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,250評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,769評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,656評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,853評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,371評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,103評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,472評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,717評(píng)論 1 281
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,487評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,815評(píng)論 2 372

推薦閱讀更多精彩內(nèi)容