中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在vue中使用elementUi上傳圖片

發布時間:2021-03-24 15:14:56 來源:億速云 閱讀:185 作者:Leah 欄目:web開發

這篇文章給大家介紹怎么在vue中使用elementUi上傳圖片,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

上傳組件封裝需求分析

在基于elementUI庫做的商城后臺管理中,需求最大的是商品管理表單這塊,因為需要錄入各種各樣的商品圖片信息。加上后臺要求要傳遞小于2M的圖片,因此封裝了一個upload.vue組件作為上傳頁面的子組件,它用于管理圖片上傳邏輯。

upload.vue解析

upload主要用于實現表單上傳圖片的需求,主要由input +img 構成當沒有圖片的時候顯示默認圖片,有圖片則顯示上傳圖片,因為input樣式不太符合需求所以只是將起設置為不可見,不能將其設置為display:none。否則將將無法觸發input的change事件

upload.vue代碼如下:

<template>
 <div>
 <div class="upload-box" :>
 <!-- 用戶改變圖片按鈕的點擊 觸發上傳圖片事件 -->
 <input type="file" :ref="imgType$1" @change="upload(formVal$1,imgType$1)" class="upload-input" />
 <!-- img 的 src 用于渲染一個 圖片路徑 傳入圖片路徑 渲染出圖片 -->
 <img :src="formVal$1[imgType$1]?formVal$1[imgType$1]:'static/img/upload.jpg'" />
 </div>
 </div>
</template>
<script>
/* 
 該組件因為要上傳多個屬性的圖片 主圖(mainImg) 詳細圖(detailImg) 規格圖 (plusImg) 
 該組件基于壓縮插件lrz,所以下方打入該組件
 npm install lrz --save 即可
*/
import lrz from 'lrz';
export default {
 name: 'uploadImg', //組件名字
 props: {
  formVal: {
   type: Object, //props接受對象類型數據(表單對象也可以是純對象類型)
   required: true,
   default: {}
  },
  imgType: {    //表單對象中的圖片屬性 example:mainImg
   type: String,
   required: true,
   default: ''
  },
  imgStyle: {
   type: Object,  // 用于顯示的圖片的樣式 
   required: true //必須傳遞
  }
 },
 created: function() {
  //生命周期函數 
 },
 data: function() {
  /*
   因為該組件需要改變父組件傳遞過來的值,
   所以將起拷貝一份
  */
  let formVal$1 = this.formVal;
  let imgType$1 = this.imgType;
  return {
   formVal$1,
   imgType$1,
   uploadUrl: url,//你的服務器url地址
  };
 },
 methods: {
  upload: function(formVal, imgType) {
   var self = this;
   //圖片上傳加載我們在這里加入提示,下方需要主動關閉,防止頁面卡死
   var loadingInstance = this.$loading({
    text: '上傳中'
   });
   var that = this.$refs[imgType].files[0]; //文件壓縮file
   //圖片上傳路徑
   var testUrl = this.uploadUrl; //圖片上傳路徑
   try {
    //lrz用法和上一個一樣也是一個壓縮插件來的
    lrz(that)
     .then(function(message) {
      var formData = message.formData; //壓縮之后我們拿到相應的formData上傳
      self.$axios
       .post(testUrl, formData)
       .then(function(res) {
        console.log(res);
        if (res && res.data.iRet == 0) {
         formVal[imgType] = res.data.objData.sUrl;
         //上傳成功之后清掉數據防止下次傳相同圖片的時候不觸發change事件 
         self.$refs[imgType].value = '';
         /*
          這里因為使用elementUI中的表單驗證,
          當上傳圖片完成之后還會提示沒有上傳圖片
          所以需要通知父組件清除該驗證標記 
          */
         self.$emit('clearValidate', imgType);
         self.$nextTick(() => {
          // 以服務的方式調用的 Loading 需要異步關閉
          loadingInstance.close();
         });
        } else {
         throw res.data.sMsg;
        }
       })
       .catch(function(err) {
        self.$nextTick(() => {
         // 以服務的方式調用的 Loading 需要異步關閉
         loadingInstance.close();
        });
        //接口報錯彈出提示
        alert(err);
       });
     })
     .catch(function(err) {
      self.$nextTick(() => {
       loadingInstance.close();
      });
     });
   } catch (e) {
    //關閉加載動畫實例
    self.$nextTick(() => {
     loadingInstance.close();
    });
   }
  }
 },
 mounted: function() {},
 watch: {
  /*
  這里需要注意當父組件上傳一個圖片然后通過重置按鈕重置的時候.
   我們需要監聽一下,防止上傳同一張圖片上傳失敗
  */
  formVal: {
   handle: function(newVal, oldVal) {
    var imgType = this.imgType;
    if (newVal[imgType] == '') {
     //這里使用了原生js寫法當然也可以通過ref引用找到,后者更好
     document.getElementsByClassName('upload-input')[0].value = '';
    }
   }
  }
 }
};
</script>
<style scoped>
/*
 這里是默認的設置圖片的尺寸。可以通過父組件傳值將其覆蓋
*/
.upload-box {
 position: relative;
 height: 100px;
 width: 100px;
 overflow: hidden;
}

.upload-box img {
 width: 100%;
 height: 100%;
}

.upload-box .upload-input {
 position: absolute;
 left: 0;
 opacity: 0;
 width: 100%;
 height: 100%;
}
</style>

商品頁中使用upload組件

good.vue中我們引入upload組件。并且傳遞相應表單對象,需上傳的圖片類型的屬性,以及圖片顯示樣式給子組件

good.vue核心代碼:

<template>
 <el-form ref="form" :model="form" label-width="80px" label-position="top" :rules="rules">
 <!-- 無關代碼略 -->
 <el-form-item label="詳情圖" prop="sDetailImg" ref="sDetailImg">
  <uploadImg :form-val="form" :img-type="'sDetailImg'" :img- @clearValidate="clearValidate"></uploadImg>
 </el-form-item>
 <el-form-item>
  <el-row >
  <el-button type="primary" size="medium" @click.stop="submit('form')" v-if="!form.ID">保存</el-button>
  <el-button type="primary" size="medium" @click.stop="submit('form')" v-else-if="form.ID">修改</el-button>
  <el-button size="medium" @click.stop="resetForm('form')">重置</el-button>
  </el-row>
 </el-form-item>
 </el-form>
 <!-- 略 -->
</template>
<script>
 import uploadImg from "../common/uploadImg"; //圖片上傳
 export default {
 name: "good", //組件名字用戶緩存 
 data: function() {
  return {
  form: {
  ID: NULL,
  //其他字段略
  sDetailImg: "" //商品詳細圖
  },
  detailImgStl: {
  width: "350px",
  height: "150px"
  },
  rules: {
  sDetailImg: [{
  required: true,
  message: "請填寫詳細圖信息",
  trigger: "change"
  }],
  }
  }
 },
 methods: {
  //這里監聽子組件回寫的信息,用戶清除上傳成功之后還顯示圖片未上傳的bug
  clearValidate: function(imgName) {
  //清空圖片上傳成功提示圖片沒有上傳的驗證字段
  this.$refs[imgName].clearValidate();
  },
  //重置表單
  resetForm: function(formName) {
  this.confirm("確認重置表單", function(self) {
  self.$refs[formName].resetFields();
  })

  }
 },
 }
</script>

關于怎么在vue中使用elementUi上傳圖片就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

蕲春县| 贵南县| 石柱| 垦利县| 游戏| 晴隆县| 土默特右旗| 阿荣旗| 夹江县| 新巴尔虎左旗| 哈巴河县| 丹江口市| 周至县| 岢岚县| 巴林右旗| 梧州市| 秦安县| 广河县| 米林县| 西宁市| 临洮县| 五指山市| 手游| 合作市| 儋州市| 泰宁县| 临海市| 方山县| 西乌| 随州市| 长治市| 富宁县| 湘阴县| 女性| 汤阴县| 抚顺县| 修武县| 元朗区| 右玉县| 衡阳市| 佛冈县|