亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

上傳組件封裝需求分析

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

upload.vue解析

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

upload.vue代碼如下:

<template>
 <div>
 <div class="upload-box" :style="imgStyle">
 <!-- 用戶改變圖片按鈕的點擊 觸發(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>
/* 
 該組件因為要上傳多個屬性的圖片 主圖(mainImg) 詳細圖(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() {
  /*
   因為該組件需要改變父組件傳遞過來的值,
   所以將起拷貝一份
  */
  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 = '';
         /*
          這里因為使用elementUI中的表單驗證,
          當上傳圖片完成之后還會提示沒有上傳圖片
          所以需要通知父組件清除該驗證標記 
          */
         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();
        });
        //接口報錯彈出提示
        alert(err);
       });
     })
     .catch(function(err) {
      self.$nextTick(() => {
       loadingInstance.close();
      });
     });
   } catch (e) {
    //關(guān)閉加載動畫實例
    self.$nextTick(() => {
     loadingInstance.close();
    });
   }
  }
 },
 mounted: function() {},
 watch: {
  /*
  這里需要注意當父組件上傳一個圖片然后通過重置按鈕重置的時候.
   我們需要監(jiān)聽一下,防止上傳同一張圖片上傳失敗
  */
  formVal: {
   handle: function(newVal, oldVal) {
    var imgType = this.imgType;
    if (newVal[imgType] == '') {
     //這里使用了原生js寫法當然也可以通過ref引用找到,后者更好
     document.getElementsByClassName('upload-input')[0].value = '';
    }
   }
  }
 }
};
</script>
<style scoped>
/*
 這里是默認的設(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: "" //商品詳細圖
  },
  detailImgStl: {
  width: "350px",
  height: "150px"
  },
  rules: {
  sDetailImg: [{
  required: true,
  message: "請?zhí)顚懺敿殘D信息",
  trigger: "change"
  }],
  }
  }
 },
 methods: {
  //這里監(jiān)聽子組件回寫的信息,用戶清除上傳成功之后還顯示圖片未上傳的bug
  clearValidate: function(imgName) {
  //清空圖片上傳成功提示圖片沒有上傳的驗證字段
  this.$refs[imgName].clearValidate();
  },
  //重置表單
  resetForm: function(formName) {
  this.confirm("確認重置表單", function(self) {
  self.$refs[formName].resetFields();
  })

  }
 },
 }
</script>

寫在最后

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

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

相關(guān)文章

  • vue 動態(tài)組件用法示例小結(jié)

    vue 動態(tài)組件用法示例小結(jié)

    這篇文章主要介紹了vue 動態(tài)組件用法,結(jié)合實例形式總結(jié)分析了vue 動態(tài)組件基本功能、原理、使用方法及操作注意事項,需要的朋友可以參考下
    2020-03-03
  • 解決vue 引入子組件報錯的問題

    解決vue 引入子組件報錯的問題

    今天小編就為大家分享一篇解決vue 引入子組件報錯的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • vue.js實現(xiàn)只能輸入數(shù)字的輸入框

    vue.js實現(xiàn)只能輸入數(shù)字的輸入框

    這篇文章主要為大家詳細介紹了vue.js實現(xiàn)只能輸入數(shù)字的輸入框,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • Vue?websocket封裝實現(xiàn)方法詳解

    Vue?websocket封裝實現(xiàn)方法詳解

    項目中需要使用websocke,這個是我自己修修改改好多次之后用得最順手的一版,分享一下。這個封裝需要搭配vuex使用,因為收到的數(shù)據(jù)都保存在vuex中了,真的絕絕子好用,解決了我一大堆問題
    2022-09-09
  • vue+vant-UI框架實現(xiàn)購物車的復(fù)選框全選和反選功能

    vue+vant-UI框架實現(xiàn)購物車的復(fù)選框全選和反選功能

    這篇文章主要介紹了vue+vant-UI框架實現(xiàn)購物車的復(fù)選框全選和反選功能,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-11-11
  • Vue導(dǎo)入Echarts實現(xiàn)散點圖

    Vue導(dǎo)入Echarts實現(xiàn)散點圖

    這篇文章主要為大家詳細介紹了Vue導(dǎo)入Echarts實現(xiàn)散點圖,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-12-12
  • 解決報錯ValidationError: Progress Plugin Invalid Options問題

    解決報錯ValidationError: Progress Plugin Invalid&

    這篇文章主要介紹了解決報錯ValidationError: Progress Plugin Invalid Options問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Vue?事件中的?.native你搞明白了嗎

    Vue?事件中的?.native你搞明白了嗎

    .native主要是給自定義的組件添加原生事件,可以理解為該修飾符的作用就是把一個vue組件轉(zhuǎn)化為一個普通的HTML標簽,并且該修飾符對普通HTML標簽是沒有任何作用的,這篇文章主要介紹了vue?事件中的?.native你搞清楚了嗎,需要的朋友可以參考下
    2023-02-02
  • 在vue中使用express-mock搭建mock服務(wù)的方法

    在vue中使用express-mock搭建mock服務(wù)的方法

    這篇文章主要介紹了在vue中使用express-mock搭建mock服務(wù)的方法,文中給大家提到了在vue-test-utils 中 mock 全局對象的相關(guān)知識 ,需要的朋友可以參考下
    2018-11-11
  • vue路由攔截器和請求攔截器知識點總結(jié)

    vue路由攔截器和請求攔截器知識點總結(jié)

    在本篇文章里小編給各位整理的是一篇關(guān)于vue路由攔截器和請求攔截器知識點總結(jié)文章,有興趣的朋友們學(xué)習(xí)下。
    2019-11-11

最新評論