最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue+elementUi圖片上傳組件使用詳解

 更新時間:2019年08月20日 10:21:57   作者:情破  
這篇文章主要為大家詳細(xì)介紹了vue+elementUi圖片上傳組件的使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

上傳組件封裝需求分析

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

upload.vue解析

upload主要用于實(shí)現(xiàn)表單上傳圖片的需求,主要由input +img 構(gòu)成當(dāng)沒有圖片的時候顯示默認(rèn)圖片,有圖片則顯示上傳圖片,因?yàn)閕nput樣式不太符合需求所以只是將起設(shè)置為不可見,不能將其設(shè)置為display:none。否則將將無法觸發(fā)input的change事件

upload.vue代碼如下:

<template>
 <div>
 <div class="upload-box" :style="imgStyle">
 <!-- 用戶改變圖片按鈕的點(diǎn)擊 觸發(fā)上傳圖片事件 -->
 <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>
/* 
 該組件因?yàn)橐蟼鞫鄠€屬性的圖片 主圖(mainImg) 詳細(xì)圖(detailImg) 規(guī)格圖 (plusImg) 
 該組件基于壓縮插件lrz,所以下方打入該組件
 npm install lrz --save 即可
*/
import lrz from 'lrz';
export default {
 name: 'uploadImg', //組件名字
 props: {
  formVal: {
   type: Object, //props接受對象類型數(shù)據(jù)(表單對象也可以是純對象類型)
   required: true,
   default: {}
  },
  imgType: {    //表單對象中的圖片屬性 example:mainImg
   type: String,
   required: true,
   default: ''
  },
  imgStyle: {
   type: Object,  // 用于顯示的圖片的樣式 
   required: true //必須傳遞
  }
 },
 created: function() {
  //生命周期函數(shù) 
 },
 data: function() {
  /*
   因?yàn)樵摻M件需要改變父組件傳遞過來的值,
   所以將起拷貝一份
  */
  let formVal$1 = this.formVal;
  let imgType$1 = this.imgType;
  return {
   formVal$1,
   imgType$1,
   uploadUrl: url,//你的服務(wù)器url地址
  };
 },
 methods: {
  upload: function(formVal, imgType) {
   var self = this;
   //圖片上傳加載我們在這里加入提示,下方需要主動關(guān)閉,防止頁面卡死
   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; //壓縮之后我們拿到相應(yīng)的formData上傳
      self.$axios
       .post(testUrl, formData)
       .then(function(res) {
        console.log(res);
        if (res && res.data.iRet == 0) {
         formVal[imgType] = res.data.objData.sUrl;
         //上傳成功之后清掉數(shù)據(jù)防止下次傳相同圖片的時候不觸發(fā)change事件 
         self.$refs[imgType].value = '';
         /*
          這里因?yàn)槭褂胑lementUI中的表單驗(yàn)證,
          當(dāng)上傳圖片完成之后還會提示沒有上傳圖片
          所以需要通知父組件清除該驗(yàn)證標(biāo)記 
          */
         self.$emit('clearValidate', imgType);
         self.$nextTick(() => {
          // 以服務(wù)的方式調(diào)用的 Loading 需要異步關(guān)閉
          loadingInstance.close();
         });
        } else {
         throw res.data.sMsg;
        }
       })
       .catch(function(err) {
        self.$nextTick(() => {
         // 以服務(wù)的方式調(diào)用的 Loading 需要異步關(guān)閉
         loadingInstance.close();
        });
        //接口報(bào)錯彈出提示
        alert(err);
       });
     })
     .catch(function(err) {
      self.$nextTick(() => {
       loadingInstance.close();
      });
     });
   } catch (e) {
    //關(guān)閉加載動畫實(shí)例
    self.$nextTick(() => {
     loadingInstance.close();
    });
   }
  }
 },
 mounted: function() {},
 watch: {
  /*
  這里需要注意當(dāng)父組件上傳一個圖片然后通過重置按鈕重置的時候.
   我們需要監(jiān)聽一下,防止上傳同一張圖片上傳失敗
  */
  formVal: {
   handle: function(newVal, oldVal) {
    var imgType = this.imgType;
    if (newVal[imgType] == '') {
     //這里使用了原生js寫法當(dāng)然也可以通過ref引用找到,后者更好
     document.getElementsByClassName('upload-input')[0].value = '';
    }
   }
  }
 }
};
</script>
<style scoped>
/*
 這里是默認(rèn)的設(shè)置圖片的尺寸??梢酝ㄟ^父組件傳值將其覆蓋
*/
.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組件。并且傳遞相應(yīng)表單對象,需上傳的圖片類型的屬性,以及圖片顯示樣式給子組件

good.vue核心代碼:

<template>
 <el-form ref="form" :model="form" label-width="80px" label-position="top" :rules="rules">
 <!-- 無關(guān)代碼略 -->
 <el-form-item label="詳情圖" prop="sDetailImg" ref="sDetailImg">
  <uploadImg :form-val="form" :img-type="'sDetailImg'" :img-style="detailImgStl" @clearValidate="clearValidate"></uploadImg>
 </el-form-item>
 <el-form-item>
  <el-row style="text-align:center;">
  <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: "" //商品詳細(xì)圖
  },
  detailImgStl: {
  width: "350px",
  height: "150px"
  },
  rules: {
  sDetailImg: [{
  required: true,
  message: "請?zhí)顚懺敿?xì)圖信息",
  trigger: "change"
  }],
  }
  }
 },
 methods: {
  //這里監(jiān)聽子組件回寫的信息,用戶清除上傳成功之后還顯示圖片未上傳的bug
  clearValidate: function(imgName) {
  //清空圖片上傳成功提示圖片沒有上傳的驗(yàn)證字段
  this.$refs[imgName].clearValidate();
  },
  //重置表單
  resetForm: function(formName) {
  this.confirm("確認(rèn)重置表單", function(self) {
  self.$refs[formName].resetFields();
  })

  }
 },
 }
</script>

寫在最后

關(guān)于圖片上傳之前我也寫過一個小程序版本,總體看來pc端的圖片上傳相對于小程序 要復(fù)雜一點(diǎn),這個封裝只能滿足當(dāng)下單圖上傳的需求也有他的不足之處。當(dāng)然也可以擴(kuò)展為多圖上傳,關(guān)于多圖上傳的網(wǎng)上也有很多例子。這里不再一一贅述。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Vue手機(jī)號正則匹配姓名加密展示功能的實(shí)現(xiàn)

    Vue手機(jī)號正則匹配姓名加密展示功能的實(shí)現(xiàn)

    這篇文章主要介紹了Vue手機(jī)號正則匹配,姓名加密展示,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-08-08
  • vue3中使用editor.js的詳細(xì)步驟記錄

    vue3中使用editor.js的詳細(xì)步驟記錄

    富文本編輯器作為直接與用戶交互的內(nèi)容輸入生產(chǎn)工具,對大家的項(xiàng)目來說非常重要,下面這篇文章主要給大家介紹了關(guān)于vue3中使用editor.js的詳細(xì)步驟,需要的朋友可以參考下
    2024-01-01
  • 詳解Nuxt.js部署及踩過的坑

    詳解Nuxt.js部署及踩過的坑

    這篇文章主要介紹了詳解Nuxt.js部署及踩過的坑,Nuxt.js 提供了兩種發(fā)布部署應(yīng)用的方式:服務(wù)端渲染應(yīng)用部署 和 靜態(tài)應(yīng)用部署。本文主要說說服務(wù)端渲染應(yīng)用部署,感興趣的小伙伴們可以參考一下
    2018-08-08
  • vue3使用vue-i18n的方法詳解(ts中使用$t,?vue3不用this)

    vue3使用vue-i18n的方法詳解(ts中使用$t,?vue3不用this)

    所謂的vue-i18n國際化方案就是根據(jù)它的規(guī)則自己建立一套語言字典,對于每一個字(message)都有一個統(tǒng)一的標(biāo)識符,下面這篇文章主要給大家介紹了關(guān)于vue3使用vue-i18n(ts中使用$t,?vue3不用this)的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • VUE中攔截請求并無感知刷新token方式

    VUE中攔截請求并無感知刷新token方式

    這篇文章主要介紹了VUE中攔截請求并無感知刷新token方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 淺析vue3的setup的使用和原理

    淺析vue3的setup的使用和原理

    setup是Vue3中引入的一個新的組件選項(xiàng),是Vue3中函數(shù)式組件的核心部分,它提供了一種新的方式來編寫組件邏輯,下面就來和大家講講它的使用和原理
    2023-08-08
  • nuxt.js 在middleware(中間件)中實(shí)現(xiàn)路由鑒權(quán)操作

    nuxt.js 在middleware(中間件)中實(shí)現(xiàn)路由鑒權(quán)操作

    這篇文章主要介紹了nuxt.js 在middleware(中間件)中實(shí)現(xiàn)路由鑒權(quán)操作,具有很好的參考價(jià)值,希望大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • vue3使用iframe嵌入ureport2設(shè)計(jì)器,解決預(yù)覽時NullPointerException異常問題

    vue3使用iframe嵌入ureport2設(shè)計(jì)器,解決預(yù)覽時NullPointerException異常問題

    這篇文章主要介紹了vue3使用iframe嵌入ureport2設(shè)計(jì)器,解決預(yù)覽時NullPointerException異常問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • vue父子組件的互相傳值和調(diào)用

    vue父子組件的互相傳值和調(diào)用

    這篇文章主要介紹了vue父子組件的互相傳值和調(diào)用,幫助大家更好的理解和學(xué)習(xí)使用vue框架,感興趣的朋友可以了解下
    2021-04-04
  • vue3中的setup()函數(shù)基本使用詳解

    vue3中的setup()函數(shù)基本使用詳解

    在 Vue3 中,setup 函數(shù)是一個新引入的概念,它代替了之前版本中的 data、computed、methods 等選項(xiàng),用于設(shè)置組件的初始狀態(tài)和邏輯,本文將主要介紹Setup的基本用法和少量原理,感興趣的朋友一起看看吧
    2024-02-02

最新評論

水城县| 灵山县| 南汇区| 惠东县| 诏安县| 射洪县| 若尔盖县| 靖边县| 耿马| 太谷县| 芮城县| 萨迦县| 应城市| 肥西县| 台江县| 家居| 阿鲁科尔沁旗| 濮阳市| 平邑县| 信宜市| 腾冲县| 公主岭市| 衡南县| 莆田市| 普宁市| 西昌市| 西贡区| 东乡族自治县| 兴城市| 闸北区| 蚌埠市| 楚雄市| 龙海市| 台北县| 鲜城| 乌兰察布市| 张家界市| 望城县| 中阳县| 宁蒗| 涞源县|