vue开发:对Element上传功能的二次封装

最近公司老项目改用vue开发,前端框架采用element ui,这个框架风格还是很漂亮的,只是上传功能有一些问题,比如:limit=1限制上传数量后,后面的添加按钮没有隐藏,再用就是如果上传图片组,很多需求需要对图片组进行排序修改,基于这两个需求,对element的el-upload组件进行了二次封装。

首先引入sortable.js这个插件,这个是一个很强大的排序插件,下面直接上我封装的上传代码

组件的html部分:

 

<template id='example'>
 <div>
 <el-upload :action="elAction"
 :ext="elExt"
 :data="elData"
 :file-list="elFileList"
 :limit="elLimit"
 :on-exceed="onElExceed"
 :before-upload="beforeElUpload"
 :on-remove="onElRemove"
 :before-remove="beforeElRemove"
 :on-success="onElSuccess"
 :on-error="onElError"
 :on-change="onElChange"
 :list-type="elListType"
 :on-preview="pictureCardPreview"
 :class="{elExceed:checkLimit}">
 <i class="el-icon-plus" v-if="isImage"></i>
 <el-button size="small" type="primary" v-else>点击上传</el-button>
 </el-upload>
 <el-dialog :visible.sync="dialogVisible" size="tiny" v-if="isImage">
 <img width="100%" :src="dialogImageUrl" alt="">
 </el-dialog>
 </div>
</template>

组件的注册js

Vue.component('pa-upload', {
 template: '#example',
 props: {
 data: Object,
 limit: {
 type:Number,
 default:0
 },
 fileList: Array,
 ext: {
 type: String,
 default: ".jpg,.png,.gif"
 },
 maxSize: {
 type: Number,
 default: 1204
 },
 action:String,
 listType: {
 type: String,
 default: "picture-card"
 },
 sortable: { type: Boolean, default: false },
 onPreview: { type: Function, default: function () { } },
 onRemove: { type: Function, default: function () { } },
 onSuccess: { type: Function, default: function () { } },
 onError: { type: Function, default: function () { } },
 onProgress: { type: Function, default: function () { } },
 onChange: { type: Function, default: function () { } },
 beforeUpload: { type: Function, default: function () { return true;}},
 beforeRemove: { type: Function, default: function () { return true;}},
 },
 data: function(){
 return {
 dialogImageUrl: "",
 dialogVisible: false,
 elAction: this.action,
 elSortable: this.sortable,
 elCount:0,
 elData:this.data,
 elFileList: this.fileList,
 elLimit: this.limit,
 elExt: this.ext,
 elMaxSize: this.maxSize,
 elListType: this.listType,
 }
 },
 created: function ()
 {
 this.elCount = this.elFileList.length;
 },
 mounted: function () {
 var that = this;
 if (this.elSortable)
 {
 var list = this.$el.querySelector('.el-upload-list');
 new Sortable(list, {
 onEnd: function (ev) {
 var arr = that.elFileList;
 arr[ev.oldIndex] = arr.splice(ev.newIndex, 1, arr[ev.oldIndex])[0];
 },
 });
 }
 },
 computed: {
 checkLimit: function () {
 //console.log(this.elLimit > 0 && this.elCount >= this.elLimit)
 return (this.elLimit > 0 && this.elCount >= this.elLimit)
 },
 isImage: function () {
 return this.elListType == "picture-card";
 },
 },
 watch: {
 elFileList: {
 handler(newName, oldName) {
 //console.log(this.elFileList);
 this.$emit('input', JSON.stringify(newName));//传值给父组件, 让父组件监听到这个变化
 },
 immediate:true // 代表在wacth里声明了firstName这个属性之后立即先去执行handler方法
 }
 },
 methods: {
 beforeElUpload: function (file)
 {
 console.log("beforeUpload");
 var ext = this.elExt;
 var maxSize = this.elMaxSize;
 var isOkExt = ext.indexOf(file.name.substring(file.name.lastIndexOf('.'))) >= 0;
 if (!isOkExt) {
 this.$message.error('只能上传' + ext + '格式的文件');
 return false;
 }
 var isLtmaxWidth = file.size / 1024 < maxSize;
 if (!isLtmaxWidth) {
 this.$message.error('上传文件大小不能超过' + maxSize + 'KB!');
 return false;
 }
 return this.beforeUpload(file);
 },
 onElSuccess: function (response, file, fileList)
 {
 this.elCount = fileList.length;
 response.name = file.name;
 response.url = file.url;
 this.elFileList.push(response);
 this.onSuccess(response, file, fileList);
 },
 onElError: function (err, file, fileList) {
 this.onError(err, file, fileList);
 },
 onElChange: function (file, fileList) {
 this.onChange(file, fileList);
 },
 onElProgress: function (event, file, fileList)
 {
 this.onProgress(event, file, fileList);
 },
 onElRemove:function(file, fileList)
 {
 this.elCount = fileList.length;
 this.elFileList = fileList;
 this.onRemove(file, fileList);
 },
 beforeElRemove: function (file, fileList)
 {
 return this.beforeRemove(file, fileList);
 },
 onElExceed: function (files, fileList)
 {
 this.$message.error('只能上传' + this.elLimit + '个文件!');
 },
 pictureCardPreview:function(file) {
 this.dialogImageUrl = file.url;
 this.dialogVisible = true;
 }
 }
 })
组件的使用:
 <pa-upload action="/e/upload/"
 :data="{}"
 :file-list="[{id:1,name:'1.jpg',url:'/upload/test.png'}]"
 ext=".jpg,.png,.docx"
 :max-size="1024"
 :sortable="true"
 list-type="picture-card"
 v-model="image"
 :limit="5">
 </pa-upload>

 

ext:允许上传的格式

max-size:最大上传尺寸,单位kb

sortable:是否允许拖动排序

v-model:和data中的属性绑定,实现双向绑定。

其他属性和element的保持一致。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值