摘要
随着前端技术的发展,系统开发的复杂度不断提升,传统开发方式将整个系统做成整块应用,导致修改和维护成本高昂。组件化开发作为一种解决方案,能够实现单独开发、单独维护,并能灵活组合组件,从而提升开发效率和降低维护成本。本文旨在介绍一款基于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', //服务端文件接受key
formData: 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