摘要
隨著前端技術的發展,系統開發的復雜度不斷提升,傳統開發方式將整個系統做成整塊應用,導致修改和維護成本高昂。組件化開發作為一種解決方案,能夠實現單獨開發、單獨維護,并能靈活組合組件,從而提升開發效率和降低維護成本。本文旨在介紹一款基于Vue的圖片文件上傳組件,該組件不僅支持圖片文件上傳,還集成了圖片壓縮功能,以滿足現代前端應用的需求。
一、引言
在現代前端開發中,組件化已成為提高開發效率和可維護性的關鍵手段。圖片文件上傳作為前端應用中常見的功能之一,其實現方式往往涉及多個步驟和復雜的邏輯。通過組件化開發,我們可以將圖片文件上傳功能封裝成一個獨立的組件,實現單獨開發和維護,同時提供統一的接口供其他組件使用,從而提高系統的可復用性和可擴展性。
二、組件化開發的優勢
組件化開發通過將系統拆分為多個獨立的組件,實現了代碼的解耦和模塊化。這種開發方式具有以下優勢:
-
獨立開發:每個組件可以獨立開發、測試和部署,提高了開發的并行度和效率。
-
單獨維護:組件的維護變得更為簡單,只需關注特定組件的邏輯和功能,降低了維護成本。
-
靈活組合:組件之間可以靈活組合,適應不同的業務場景和需求。
效果圖如下:
-
需求分析
圖片文件上傳組件需要滿足以下需求:
-
支持圖片文件的選擇和上傳。
-
支持圖片文件的壓縮,以減小文件大小和上傳時間。
-
提供上傳進度和結果反饋。
-
技術選型
選擇Vue作為前端框架,利用其組件化的特性和響應式數據綁定機制來實現圖片文件上傳組件的開發。同時,結合前端文件處理庫和瀏覽器原生API來實現圖片文件的壓縮和上傳功能。
-
組件實現
(1)文件選擇與上傳
使用<input type="file">
元素允許用戶選擇圖片文件,并通過監聽change
事件獲取到文件信息。然后,使用FormData
對象將文件包裝成表單數據,并通過axios
等HTTP庫發送POST請求將文件上傳到服務器。
(2)圖片壓縮
在文件上傳之前,使用前端文件處理庫(如compressorjs
)對圖片文件進行壓縮。壓縮過程中可以設置壓縮質量、壓縮格式等參數,以滿足不同場景的需求。壓縮完成后,將壓縮后的文件用于上傳。
(3)上傳進度與結果反饋
通過監聽HTTP請求的progress
事件來獲取上傳進度,并在組件中顯示上傳進度條。同時,監聽請求的then
和catch
方法分別處理上傳成功和失敗的情況,并向外部提供上傳結果的事件或回調函數。
cc-oneImgFileUpload單個圖片上傳組件
使用方法
<!-- photoList:選擇的圖片數組 @click:圖片選擇事件-->
<cc-oneImgFileUpload :photoList="photoList" @click="addPhotoClick"></cc-oneImgFileUpload>
HTML代碼實現部分
<template><view class="content" v-if="seen"><form @submit="formSubmit" @reset="formReset"><view class="inputView"><text class="leftTitle">交通指引</text></view><textarea class="rightTextarea" name="direct" placeholder=" 請輸入交通指引" /><view class="inputView"><text class="leftTitle">房屋介紹</text></view><textarea class="rightTextarea" name="village" placeholder=" 請輸入房屋介紹" /><view class="inputView"><text class="leftTitle">添加房源照片(僅可添加1張)</text></view><!-- photoList:選擇的圖片數組 @click:圖片選擇事件--><cc-oneImgFileUpload :photoList="photoList" @click="addPhotoClick"></cc-oneImgFileUpload><view class="uni-btn-v"><button class="botBtn" type="primary" form-type="submit">提交</button><view class="tipText"> 注意事項: 請確保您填寫的房屋信息真實無誤 </view></view></form></view>
</template><script>import Vue from 'vue';export default {data() {return {photoList: [],seen: true,myParamData: {},isClick: false,};},methods: {formSubmit: function(e) {console.log('form發生了submit事件,攜帶數據為:' + JSON.stringify(e.detail.value));if (this.isClick) {let that = this;setTimeout(function() {that.isClick = false;}, 600)return;}this.isClick = true;var formdata = e.detail.value;this.myParamData = Object.assign(this.myParamData, formdata);console.log('頁面3 myParamData=' + JSON.stringify(this.myParamData));if (formdata['direct'].length < 2) {uni.showModal({content: '請輸入交通指引',showCancel: false});return;}if (formdata['village'].length < 2) {uni.showModal({content: '請輸入所在小區介紹',showCancel: false});return;}if (this.photoList.length < 1) {uni.showModal({content: '請添加房源照片',showCancel: false});return;}uni.showLoading({title: '上傳中'})let myFilePath = '';if (this.photoList.length > 0) {myFilePath = this.photoList[0].filePath;}// 服務器地址上傳地址 僅為示例,非真實的接口地址let baseUrl = "http://gzcc.com/cc//appSc/up"uni.uploadFile({url: baseUrl, //僅為示例,非真實的接口地址filePath: myFilePath, //文件路徑name: 'image', //服務端文件接受keyformData: this.myParamData,success: (uploadFileRes) => {uni.hideLoading();let dataDic = JSON.parse(uploadFileRes.data);console.log('uploadFileRes成功 = ' + JSON.stringify(uploadFileRes));console.log('datadic成功 = ' + typeof(dataDic));console.log('code碼 = ' + dataDic['code']);}});},addPhotoClick() {uni.hideLoading();let myThis = this;if (myThis.photoList.length >= 1) {myThis.photoList = [];}uni.chooseImage({count: 1,sizeType: ['compressed'], //可以指定是原圖還是壓縮圖,默認二者都有sourceType: ['album'], //從相冊選擇success: function(res) {myThis.photoList = [{'filePath': res.tempFilePaths[0]}];console.log('選擇圖片 =' + JSON.stringify(myThis.photoList));}});},}};
</script><style>.uni-form-item .title {padding: 20rpx 0;}.content {display: flex;flex-direction: column;width: 100%;height: auto;}.inputView {flex-direction: row;display: flex;height: 40px;align-items: center;width: 100%;}.line {width: 90%;height: 2rpx;margin-left: -2rpx;background-color: #f8f8f8;margin-left: 5%;}.leftTitle {margin-left: 40rpx;width: 284px;height: 32px;line-height: 32px;font-size: 28rpx;color: #333333;}.rightTextarea {margin-left: 5%;width: 90%;height: 106px;line-height: 40rpx;border-radius: 12rpx;border: solid 1px #F5F5F5;font-size: 15px;}.uni-btn-v {width: 100%;height: auto;}.botBtn {width: 90%;margin-top: 36px;height: 48px;}.tipText {width: 100%;margin-left: 0px;text-align: center;color: #666666;margin-top: 36px;margin-bottom: 36px;font-size: 28rpx;}
</style>
四、組件的應用與效果
將圖片文件上傳與壓縮組件應用于實際項目中,通過與其他組件和業務的結合,實現了快速開發和高效維護。該組件不僅簡化了圖片文件上傳的流程,還通過圖片壓縮減小了文件大小,降低了上傳時間和服務器壓力。同時,組件的獨立性和可復用性也提高了系統的可擴展性和可維護性。
五、總結與展望
本文介紹了基于Vue的圖片文件上傳與壓縮組件的設計與實現過程。通過組件化開發,我們成功地將圖片文件上傳功能封裝成一個獨立的組件,并集成了圖片壓縮功能,以滿足現代前端應用的需求。未來,我們將繼續探索更多類型的組件和更高效的開發方式,以提升前端開發的效率和可維護性。
項目下載地址:
https://ext.dcloud.net.cn/plugin?id=13066