vue web端實現(xiàn)圖片上傳

web端項目中有一個上傳圖片的功能石抡,但是element-ui提供的上傳插件都不能滿足的我的需要,dropzone也因為我們框架封裝的原因拯勉,在重置和初始化時都有一些問題蚁滋。在研究dropzone的問題上花費了很多時間,最后也沒解決耘斩,就索性自己寫了一個沼填。

整理思路
功能方面:
1、上傳圖片括授,那肯定是input,type=“file”
2岩饼、獲取圖片荚虚,監(jiān)聽input的change事件
3、拿到圖片上傳
頁面樣式:
1籍茧、展示一個虛線框版述,沒有圖片時中間顯示一個+號,點擊選擇圖片寞冯;
2渴析、有圖片時展示圖片,鼠標(biāo)懸浮在圖片上方時顯示移除按鈕吮龄,否則不展示移除按鈕

代碼如下:

<template>
   <div class="dropzone">
       <input ref="uploadInput"
              type="file"
              name="file"
              value=""
              accept="image/gif,image/jpeg,image/jpg,image/png"
              @change="selectImg($event)">
       <div :class="operationShow?'operation-div':'operation-div hide'">
           <img :src="defaultImg">
           <span class="remove"
                 @click="remove">移除</span>
       </div>
       <div :class="operationShow?'txt hide':'txt'">
           +
       </div>
   </div>
</template>
<script>
export default {
   props: {
       url: {
           default: "",
           type: String
       },
       imgSrc: {
           default: "",
           type: String
       },
       autoUpload: {
           default: true,
           type: Boolean
       }
   },
   data()
   {
       return {
           operationShow: false,
           uploadFile: "",
           defaultImg: process.env.BASE_API + "/service-admin/" + this.imgSrc
       };
   },
   watch: {
       imgSrc(newsVal, oldVal)
       {
           this.init(newsVal);
       }
   },
   mounted()
   {
       this.init(this.imgSrc);
   },
   methods: {
       //選擇圖片
       selectImg(e)
       {
           const imgFile = e.target.files[0];
           if (imgFile)
           {
               this.uploadFile = imgFile;
               let reader = new FileReader();
               reader.readAsDataURL(imgFile);
               reader.onload = (event) =>
               {
                   this.defaultImg = reader.result;
                   this.operationShow = true;
                   if (this.autoUpload)
                   {
                       this.upload();
                   }
               };
           }
       },
       upload()
       {
           //將圖片轉(zhuǎn)成FormData類型數(shù)據(jù)
           let formData = new FormData();
           formData.append("file", this.uploadFile);
           ///通知父級上傳圖片
           this.$emit("uploadImg", formData);
       },
       remove()
       {
           // 圖片設(shè)為空
           this.defaultImg = "";
           // 隱藏圖片層俭茧,展示選擇圖片層
           this.operationShow = false;
           //通知父級移除圖片
           this.$emit("removeImg");
       },
       init(data)
       {
           //圖片不為空時,顯示圖片層并展示圖片漓帚,input層隱藏
           if (data !== undefined && data !== "" && data !== null)
           {
               this.operationShow = true;
               this.defaultImg = process.env.BASE_API + "/" + data;
           }
           else
           {
               //圖片為空時母债,不顯示圖片層,顯示input層
               this.defaultImg = "";
               this.operationShow = false;
           }
       }
   }
};
</script>
<style   rel="stylesheet/scss" lang="scss" >
@mixin base{
   position: absolute;
   top: 5%;
   height: 100%;
   width: 100%;
}
.dropzone{
   position: relative;
   height: 200px;
   max-width: 200px;
   width:100%;
   border: 1px dashed #ccc;
   box-sizing: border-box;
   input{
       @include base;
       opacity: 0;
       z-index: 10;
   }
   .operation-div{
       @include base;
       z-index: 100;
       text-align: center;
       img{
           width: 80%;
           height: 80%;
       }
       &:hover>.remove{
           display: block;
       }
       .remove{
           display: block;
           height: 10%;
           width: 100%;
           display: none;
           text-align: center;
           cursor: pointer;
       }
       .remove:hover{
           color: #409EFF;
       }
   }
   .txt{
       position: absolute;
       width: 100%;
       height: 30px;
       font-size: 40px;
       line-height: 30px;
       top: 50%;
       transform: translateY(-50%);
       text-align: center;
       color: #aaa;
       z-index: 1;
   }
   .hide{
       display: none;
   }

}
</style>

在父組件中使用:

<el-form-item
                    label="圖片"
                    prop="pic">
                    <form-upload-image
                        :auto-upload="true"
                        :img-src="form.data.pic" // form表單的數(shù)據(jù)
                        @uploadImg="uploadImg"
                        @removeImg="removeImg"/>
                </el-form-item>
// 上傳圖片
        uploadImg(formData)
        {
            //手動校驗圖片輸入框
            this.$refs["dataForm"].validateField("pic");
           //使用axios上傳圖片尝抖,repo是自己寫的axios攔截器
            new Repo({
                url: 'url',
                method: "post",
                data: formData,
                headers: { "Content-Type": "multipart/form-data" }
            }).then((response) =>
            {
               // 上傳成功毡们,清空校驗信息
                this.$refs["dataForm"].clearValidate("pic");
                //修改form data數(shù)據(jù)
                this.form.data.pic = response.data[0];
            });
        },
        // 移除圖片
        removeImg()
        {
           //修改form data數(shù)據(jù)
            this.form.data.pic = "";
            //手動校驗圖片輸入框
            this.$refs["data-form"].$refs["default"].validateField("pic");
        }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市昧辽,隨后出現(xiàn)的幾起案子衙熔,更是在濱河造成了極大的恐慌,老刑警劉巖搅荞,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件红氯,死亡現(xiàn)場離奇詭異,居然都是意外死亡取具,警方通過查閱死者的電腦和手機脖隶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來暇检,“玉大人产阱,你說我怎么就攤上這事】槠停” “怎么了构蹬?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵王暗,是天一觀的道長。 經(jīng)常有香客問我庄敛,道長俗壹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任藻烤,我火速辦了婚禮绷雏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘怖亭。我一直安慰自己涎显,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布兴猩。 她就那樣靜靜地躺著期吓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪倾芝。 梳的紋絲不亂的頭發(fā)上讨勤,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音晨另,去河邊找鬼潭千。 笑死,一個胖子當(dāng)著我的面吹牛拯刁,可吹牛的內(nèi)容都是我干的脊岳。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼垛玻,長吁一口氣:“原來是場噩夢啊……” “哼割捅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起帚桩,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤亿驾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后账嚎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體莫瞬,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年郭蕉,在試婚紗的時候發(fā)現(xiàn)自己被綠了疼邀。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡召锈,死狀恐怖旁振,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤拐袜,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布吉嚣,位于F島的核電站,受9級特大地震影響蹬铺,放射性物質(zhì)發(fā)生泄漏尝哆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一甜攀、第九天 我趴在偏房一處隱蔽的房頂上張望秋泄。 院中可真熱鬧,春花似錦赴邻、人聲如沸印衔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至瞎暑,卻和暖如春彤敛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背了赌。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工墨榄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人勿她。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓袄秩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親逢并。 傳聞我的和親對象是個殘疾皇子之剧,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

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

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML標(biāo)準(zhǔn)砍聊。 注意:講述HT...
    kismetajun閱讀 27,486評論 1 45
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫背稼、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,105評論 4 62
  • 摘要: 之前用Selenium做UI自動化測試從初學(xué)到熟練碰到過很多問題玻蝌,這里就不一一細(xì)說了蟹肘,所以把最基本的操作都...
    Vicky_習(xí)慣做唯一閱讀 11,384評論 1 23
  • 本女子年芳二八,普通的家庭俯树,普通的工作帘腹,普通的生活。 越長大许饿,越能感覺是在逆風(fēng)而行阳欲。 從不怨天尤人,對于未能實現(xiàn)的...
    有多樂閱讀 368評論 0 1
  • 明明是悶熱的盛夏 卻仿佛置身在冰涼的夜 一群嬉笑的人 本應(yīng)一同走過 卻為何毀滅我 該放棄的時光與人 燃燒的熟悉空間...
    木子kivi閱讀 223評論 0 0