// element ui 文档地址:  http://element.eleme.io/#/zh-CN
<template>
<div>
<div class="upload-style">
<el-upload
:show-file-list="false"
:on-success="handleImgSuccess"
:before-upload="beforeImgUpload"
:action="uploadUrl"
:data="uploadData"
:multiple="isMultiple"
:accept="paramsObjUsed.acceptImg"
:limit="paramsObjUsed.limit"
:on-exceed="onExceed"
:on-error="handleError"
name="files[]"
>
<el-button size="small" plain icon="el-icon-plus">点击上传</el-button>
</el-upload>
<ul class="img-box" v-if="fileList && fileList.length > 0">
<li
v-for="(item, index) in fileList"
:key="index"
v-loading="item.loading"
:style="
`width:${paramsObjUsed.imgWidth};height:${paramsObjUsed.imgHeight}`
"
>
<img
v-if="item.url"
:src="item.url"
:width="paramsObjUsed.imgWidth"
alt=""
/>
<span v-if="item && isShowClose && item.url" @click="deleteImg(item)"
>✕</span
>
</li>
</ul>
</div>
</div>
</template>
<script>
export default {
name: "child",
props: {
paramsObj: {
type: Object,
required: false,
default: () => {
return {};
}
},
imgSize: {
//限制图片宽高,不带px单位
type: Object,
required: false,
default: () => {
return {
width: "",
height: ""
};
}
},
isMultiple: {
//是否多张上传
type: Boolean,
required: false,
default: () => {
return false;
}
},
isShowClose: {
//是否支持删除图片
type: Boolean,
required: false,
default: () => {
return true;
}
},
defaultImgArr: {
// 默认图片数组
type: Array,
required: false,
default: () => {
return [];
}
}
},
data() {
return {
paramsObjUsed: {
project: "", // 上传图片接受的参数,默认是“”
contentType: "", //上传图片接受的参数,默认是“”
acceptImg: "image/*", //上传图片配置接受的图片格式
imgFormat: "", //图片格式
imgFormatArr: [], //图片类型数组做匹配查询
sizeTips: "", //图片大小
imgWidth: "200px", //图片宽
imgHeight: "", //图片高
fileSize: 1048576, //默认是1M
limit: 10, //每次上传多少张图片初始化,动态改变
limitTips: 10, //每次最多上传多少张图片提示
totalImg: 100 //最多上传多少张图片
},
uploadUrl: "",
uploadData: {
project: "elementUI",
contentType: this.paramsObj.contentType
},
fileList: [], //上传服务器地址url
delFileList: [], //删除的图片
loading: false,
fileListRemove: []
};
},
watch: {
paramsObjUsed: {
handler(val) {
console.log(val.limit);
return val.limit;
},
deep: true
}
},
computed: {
newValue() {
return this.paramsObjUsed.limit;
}
},
created() {
this.paramsObjUsed = Object.assign(this.paramsObjUsed, this.paramsObj);
this.uploadUrl = this.$apis.api_common_files;
},
mounted() {
this.setImg(this.defaultImgArr);
let { uploadData } = this;
Object.assign(uploadData, this.$net.commonParams());
uploadData.signToken = this.$net.paramsSign(uploadData, this.uploadUrl);
this.uploadData = uploadData;
},
methods: {
//删除图片按钮
deleteImg(item) {
let index = this.fileList.map(val => val.url).indexOf(item.url);
if (index !== -1) {
this.fileList.forEach((val, i) => {
if (index == i) {
this.delFileList.push(val.url);
}
});
this.fileList.splice(index, 1);
if (this.isMultiple) {
this.handleRemove(index);
}
}
},
setImg(arr) {
if (Array.isArray(arr) && arr.length > 0) {
arr.forEach(val => {
this.fileList.push({
url: val
});
});
}
},
getImg() {
let savImgArr = [];
this.fileList.forEach(item => {
let val = item.url.substring(item.url.indexOf(".com") + 4);
savImgArr.push(val);
});
return savImgArr;
},
delImg() {
if (
!this.delFileList ||
!Array.isArray(this.delFileList) ||
this.delFileList.length <= 0
) {
return false;
}
let delImgArr = [];
this.delFileList.forEach(item => {
let val = item.substring(item.indexOf(".com") + 4);
delImgArr.push(val);
});
let params = {};
params.url = this.$apis.api_common_files_del;
params.data = {
url: JSON.stringify(delImgArr),
project: "hooli"
};
this.$net.req(params).then(() => {});
},
beforeImgUpload(file) {
if (this.isMultiple) {
if (this.fileList.length < this.paramsObjUsed.totalImg) {
this.paramsObjUsed.limit += 1;
}
this.fileList.push({ uid: file.uid, loading: true, url: "" });
} else {
this.fileList = [{ uid: file.uid, loading: true, url: "" }];
}
let that = this;
let imgFormatArr = this.paramsObjUsed.imgFormatArr;
if (imgFormatArr.indexOf(file.type) === -1) {
this.$message.error(
"上传的图片仅限" + this.paramsObjUsed.imgFormat + "格式"
);
return Promise.reject();
}
let fileSize = file.size;
if (fileSize > this.paramsObjUsed.fileSize) {
this.$message.error(
"上传的图片大小不能超过" + this.paramsObjUsed.sizeTips
);
return Promise.reject();
}
const isOk = new Promise(function(resolve, reject) {
let _URL = window.URL || window.webkitURL;
let img = new Image();
img.src = _URL.createObjectURL(file);
img.onload = function() {
if (that.imgSize.width) {
let valid =
img.width == that.imgSize.width &&
img.height == that.imgSize.height;
valid ? resolve() : reject();
} else {
resolve();
}
};
img.onerror = function() {
that.$message.error("图片文件受损,请重新选择上传");
return;
};
}).then(
() => {
return file;
},
() => {
if (that.imgSize) {
that.$message.error(
"上传的图片尺寸为" +
that.imgSize.width +
"*" +
that.imgSize.height +
"px"
);
}
return Promise.reject();
}
);
return isOk;
},
handleRemove(idx) {
if (this.fileListRemove.length > this.fileList.length) {
this.fileListRemove.pop();
}
if (this.paramsObjUsed.limit > this.paramsObjUsed.limitTips) {
this.paramsObjUsed.limit -= 1;
}
this.fileList.forEach((val, index) => {
if (idx == index) {
this.fileListRemove.splice(idx, 1);
}
});
},
//每次最多上传的图片张数
onExceed(files, fileList) {
let limitArr = [];
for (let i in files) {
limitArr.push(files[i]);
}
limitArr = limitArr.filter(function(x) {
return x.name;
});
limitArr.pop();
if (limitArr.length > this.paramsObjUsed.limitTips) {
this.$message({
message: "每次最多上传" + this.paramsObjUsed.limitTips + "张图片哦",
type: "warning"
});
return false;
} else if (fileList.length > this.paramsObjUsed.totalImg) {
fileList.pop();
this.$message({
message: "最多上传" + this.paramsObjUsed.totalImg + "张图片哦",
type: "warning"
});
return false;
}
},
//总共最多能上传多少张图片
maxImgArr(img, file) {
if (this.fileList.length > this.paramsObjUsed.totalImg) {
this.fileList.pop();
this.$message({
message: "最多上传" + this.paramsObjUsed.totalImg + "张图片哦",
type: "warning"
});
return false;
} else {
this.fileList.forEach(val => {
if (val.uid == file.uid) {
val.loading = false;
val.url = img;
}
});
}
},
handleImgSuccess(res, file, fileList) {
this.fileListRemove = fileList;
if (parseInt(res.code) !== 0) {
this.fileList.forEach(val => {
if (val.uid == file.uid) {
val.loading = false;
}
});
this.$message.error(res.msg);
return false;
}
let img = res.data.host + res.data.url[0];
this.maxImgArr(img, file);
this.fileList.forEach(val => {
if (val.uid == file.uid) {
val.loading = false;
val.url = img;
}
});
},
handleError(err, file, fileList) {
console.log("err", err, file, fileList);
}
}
};
</script>
<style lang="less" scoped>
.one-img {
position: relative;
max-width: 200px;
img {
display: block;
margin-top: 20px;
width: 100%;
height: 100%;
}
span {
width: 20px;
height: 20px;
display: inline-block;
position: absolute;
top: -27px;
right: -22px;
z-index: 10;
cursor: pointer;
}
}
.img-box {
display: flex;
justify-content: flex-start;
flex-wrap: wrap;
li {
height: auto;
position: relative;
margin: 15px 8px 0;
.loading-style {
position: absolute;
z-index: 9999;
left: 0;
right: 0;
top: 0;
bottom: 0;
}
img {
height: auto;
}
span {
width: 20px;
height: 20px;
display: inline-block;
position: absolute;
top: -27px;
right: -22px;
z-index: 10;
cursor: pointer;
}
}
}
</style>

上传图片组件封装 element ui的更多相关文章

  1. vue组件样式添加scoped属性之后,无法被父组件修改。或者无法在本组件修改element UI样式

    在vue开发中,需要使用scoped属性避免样式的全局干扰,但是这样在父组件中是无法被修改的,不仅如此如果项目中用了UI框架比如element Ui,这个时候在本组件也无法修改样式,因为权重问题.但是 ...

  2. 2021新年 Vue3.0 + Element UI 尝鲜小记

    2021年,又是新的一年,Vue 已经发布 3.0 版本,最好用的 UI 组件库 Element UI 也发布了适配 Vue3.0 的新版本,是时候开始学习一下这两个新技术. 本文主要记录了使用 Vu ...

  3. 封装一个优雅的element ui表格组件

    现在做后台系统用vue + elementUI 的越来越多,那element ui的 el-table 组件肯定也离不开.虽然element ui的table组件很好.但是表格和分页是分离的.每次写表 ...

  4. vue+element UI + axios封装文件上传及进度条组件

    1.前言 之前在做项目的时候,需要实现一个文件上传组件并且需要有文件上传进度条,现将之前的实现过程简单记录一下,希望可以帮助到有需要的人. 项目用的是Vue框架,UI库使用的是element UI,前 ...

  5. vue问题三:element ui的upload组件上传图片成功和移除事件

    element ui的upload组件上传图片成功和移除事件: 登录后获取到后台传的token存到中: sessionStorage.setItem("token",data.ob ...

  6. Vue + Element UI 实现权限管理系统 (功能组件封装)

    组件封装 为了避免组件代码的臃肿,这里对主要的功能部件进行封装,保证代码的模块化和简洁度. 组件结构 组件封装重构后,试图组件结构如下图所示 代码一览 Home组件被简化,包含导航.头部和主内容三个组 ...

  7. Vue + Element UI 实现权限管理系统 前端篇(七):功能组件封装

    组件封装 为了避免组件代码的臃肿,这里对主要的功能部件进行封装,保证代码的模块化和简洁度. 组件结构 组件封装重构后,试图组件结构如下图所示 代码一览 Home组件被简化,包含导航.头部和主内容三个组 ...

  8. vue+element ui 的上传文件使用组件

    前言:工作中用到 vue+element ui 的前端框架,使用到上传文件,则想着封装为组件,达到复用,可扩展.转载请注明出处:https://www.cnblogs.com/yuxiaole/p/9 ...

  9. vue+element ui 的表格列使用组件

    前言:工作中用到 vue+element ui 的前端框架,有这个场景:很多表格的列有许多一样的,所以考虑将列封装为组件.转载请注明出处:https://www.cnblogs.com/yuxiaol ...

随机推荐

  1. table-cell width:1% 深入理解

    问题描述 今天在使用Bootstrap给页面添加底部导航栏时,需要在手机下也使导航栏呈现水平排列的效果.最后在网上查找解决方法是,看到这样一个解决方法: .nav-justified > li ...

  2. hybrid简单了解

    技术点总有它的来由. 文章概要: 1.hybrid 基本概念 2.前端和客户端的交互 3.前端和客户端的交互实现 4.前端交互实现关注点 5.小结 1.hybrid 基本概念 ⑴.什么是hybrid? ...

  3. 北京大学Cousera学习笔记--1-学习规划

    1.计算机导论与C语言基础 1>.计算导论:计算机的基本原理.计算机的发展趋势.程序运行的基本原理 2>.C程序设计:感性认识C程序.理性认识C程序:机构化的程序-函数.更多的数据结构 2 ...

  4. Python语言——基础02-变量、运算符

    开篇导言: 今天开始进行python学习的笔记更新,以后我都用截图的方式更新,方便不麻烦,界面美观,今天学习更新的python学习内容是环境变量.运算符的内容 关注我博客的童鞋从现在开始也可以跟着我的 ...

  5. ASP.Net Core "The type initializer for 'Gdip' threw an exception"

    ASP.NET Core项目部署在Linux下可能会出现GDI错误 The type initializer for 'Gdip' threw an exception 解决方案:创建 libdl 的 ...

  6. centos7安装nginx1.10.1

    安装nginx. 1.首先在根目录下创建一个software文件夹用来存储下载的压缩包. 2.然后cd跳转的software文件夹下,进行压缩包的下载 wget -c https://nginx.or ...

  7. WPF Combobox数据绑定 Binding

    combobox数据绑定List链表集合区分显示值与选择的值 整体效果: 根据combobox选择情况分别打印选取值与显示值 代码: Windows窗体: <Window x:Class=&qu ...

  8. 【Spark-SQL学习之三】 UDF、UDAF、开窗函数

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 scala-2.10.4(依赖jdk1.8) spark ...

  9. Spring Boot 2.x中的management.security.enabled=false无效问题

    look: https://blog.csdn.net/qq_27385301/article/details/82899303

  10. php 当前日期加一天和指定日期加一天

    1.给当前时间加一天?一小时? <?phpecho "今天:",date('Y-m-d H:i:s'),"<br>";echo "明 ...