vue+elementUi圖片上傳組件使用詳解
上傳組件封裝需求分析
在基于elementUI庫(kù)做的商城后臺(tái)管理中,需求最大的是商品管理表單這塊,因?yàn)樾枰浫敫鞣N各樣的商品圖片信息。加上后臺(tái)要求要傳遞小于2M的圖片,因此封裝了一個(gè)upload.vue組件作為上傳頁(yè)面的子組件,它用于管理圖片上傳邏輯。
upload.vue解析
upload主要用于實(shí)現(xiàn)表單上傳圖片的需求,主要由input +img 構(gòu)成當(dāng)沒(méi)有圖片的時(shí)候顯示默認(rèn)圖片,有圖片則顯示上傳圖片,因?yàn)閕nput樣式不太符合需求所以只是將起設(shè)置為不可見,不能將其設(shè)置為display:none。否則將將無(wú)法觸發(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 用于渲染一個(gè) 圖片路徑 傳入圖片路徑 渲染出圖片 -->
<img :src="formVal$1[imgType$1]?formVal$1[imgType$1]:'static/img/upload.jpg'" />
</div>
</div>
</template>
<script>
/*
該組件因?yàn)橐蟼鞫鄠€(gè)屬性的圖片 主圖(mainImg) 詳細(xì)圖(detailImg) 規(guī)格圖 (plusImg)
該組件基于壓縮插件lrz,所以下方打入該組件
npm install lrz --save 即可
*/
import lrz from 'lrz';
export default {
name: 'uploadImg', //組件名字
props: {
formVal: {
type: Object, //props接受對(duì)象類型數(shù)據(jù)(表單對(duì)象也可以是純對(duì)象類型)
required: true,
default: {}
},
imgType: { //表單對(duì)象中的圖片屬性 example:mainImg
type: String,
required: true,
default: ''
},
imgStyle: {
type: Object, // 用于顯示的圖片的樣式
required: true //必須傳遞
}
},
created: function() {
//生命周期函數(shù)
},
data: function() {
/*
因?yàn)樵摻M件需要改變父組件傳遞過(guò)來(lái)的值,
所以將起拷貝一份
*/
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;
//圖片上傳加載我們?cè)谶@里加入提示,下方需要主動(dòng)關(guān)閉,防止頁(yè)面卡死
var loadingInstance = this.$loading({
text: '上傳中'
});
var that = this.$refs[imgType].files[0]; //文件壓縮file
//圖片上傳路徑
var testUrl = this.uploadUrl; //圖片上傳路徑
try {
//lrz用法和上一個(gè)一樣也是一個(gè)壓縮插件來(lái)的
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ù)防止下次傳相同圖片的時(shí)候不觸發(fā)change事件
self.$refs[imgType].value = '';
/*
這里因?yàn)槭褂胑lementUI中的表單驗(yàn)證,
當(dāng)上傳圖片完成之后還會(huì)提示沒(méi)有上傳圖片
所以需要通知父組件清除該驗(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)錯(cuò)彈出提示
alert(err);
});
})
.catch(function(err) {
self.$nextTick(() => {
loadingInstance.close();
});
});
} catch (e) {
//關(guān)閉加載動(dòng)畫實(shí)例
self.$nextTick(() => {
loadingInstance.close();
});
}
}
},
mounted: function() {},
watch: {
/*
這里需要注意當(dāng)父組件上傳一個(gè)圖片然后通過(guò)重置按鈕重置的時(shí)候.
我們需要監(jiān)聽一下,防止上傳同一張圖片上傳失敗
*/
formVal: {
handle: function(newVal, oldVal) {
var imgType = this.imgType;
if (newVal[imgType] == '') {
//這里使用了原生js寫法當(dāng)然也可以通過(guò)ref引用找到,后者更好
document.getElementsByClassName('upload-input')[0].value = '';
}
}
}
}
};
</script>
<style scoped>
/*
這里是默認(rèn)的設(shè)置圖片的尺寸??梢酝ㄟ^(guò)父組件傳值將其覆蓋
*/
.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>
商品頁(yè)中使用upload組件
在good.vue中我們引入upload組件。并且傳遞相應(yīng)表單對(duì)象,需上傳的圖片類型的屬性,以及圖片顯示樣式給子組件
good.vue核心代碼:
<template>
<el-form ref="form" :model="form" label-width="80px" label-position="top" :rules="rules">
<!-- 無(wú)關(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: "請(qǐng)?zhí)顚懺敿?xì)圖信息",
trigger: "change"
}],
}
}
},
methods: {
//這里監(jiān)聽子組件回寫的信息,用戶清除上傳成功之后還顯示圖片未上傳的bug
clearValidate: function(imgName) {
//清空?qǐng)D片上傳成功提示圖片沒(méi)有上傳的驗(yàn)證字段
this.$refs[imgName].clearValidate();
},
//重置表單
resetForm: function(formName) {
this.confirm("確認(rèn)重置表單", function(self) {
self.$refs[formName].resetFields();
})
}
},
}
</script>
寫在最后
關(guān)于圖片上傳之前我也寫過(guò)一個(gè)小程序版本,總體看來(lái)pc端的圖片上傳相對(duì)于小程序 要復(fù)雜一點(diǎn),這個(gè)封裝只能滿足當(dāng)下單圖上傳的需求也有他的不足之處。當(dāng)然也可以擴(kuò)展為多圖上傳,關(guān)于多圖上傳的網(wǎng)上也有很多例子。這里不再一一贅述。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
vue 動(dòng)態(tài)組件用法示例小結(jié)
這篇文章主要介紹了vue 動(dòng)態(tài)組件用法,結(jié)合實(shí)例形式總結(jié)分析了vue 動(dòng)態(tài)組件基本功能、原理、使用方法及操作注意事項(xiàng),需要的朋友可以參考下2020-03-03
解決vue 引入子組件報(bào)錯(cuò)的問(wèn)題
今天小編就為大家分享一篇解決vue 引入子組件報(bào)錯(cuò)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
vue.js實(shí)現(xiàn)只能輸入數(shù)字的輸入框
這篇文章主要為大家詳細(xì)介紹了vue.js實(shí)現(xiàn)只能輸入數(shù)字的輸入框,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-10-10
Vue?websocket封裝實(shí)現(xiàn)方法詳解
項(xiàng)目中需要使用websocke,這個(gè)是我自己修修改改好多次之后用得最順手的一版,分享一下。這個(gè)封裝需要搭配vuex使用,因?yàn)槭盏降臄?shù)據(jù)都保存在vuex中了,真的絕絕子好用,解決了我一大堆問(wèn)題2022-09-09
vue+vant-UI框架實(shí)現(xiàn)購(gòu)物車的復(fù)選框全選和反選功能
這篇文章主要介紹了vue+vant-UI框架實(shí)現(xiàn)購(gòu)物車的復(fù)選框全選和反選功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11
Vue導(dǎo)入Echarts實(shí)現(xiàn)散點(diǎn)圖
這篇文章主要為大家詳細(xì)介紹了Vue導(dǎo)入Echarts實(shí)現(xiàn)散點(diǎn)圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-12-12
解決報(bào)錯(cuò)ValidationError: Progress Plugin Invalid&
這篇文章主要介紹了解決報(bào)錯(cuò)ValidationError: Progress Plugin Invalid Options問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
在vue中使用express-mock搭建mock服務(wù)的方法
這篇文章主要介紹了在vue中使用express-mock搭建mock服務(wù)的方法,文中給大家提到了在vue-test-utils 中 mock 全局對(duì)象的相關(guān)知識(shí) ,需要的朋友可以參考下2018-11-11
vue路由攔截器和請(qǐng)求攔截器知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給各位整理的是一篇關(guān)于vue路由攔截器和請(qǐng)求攔截器知識(shí)點(diǎn)總結(jié)文章,有興趣的朋友們學(xué)習(xí)下。2019-11-11

