// 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>

转载于:https://www.cnblogs.com/sunny-shine/p/10678230.html

上传图片组件封装 element ui相关推荐

  1. vue组件库介绍以及组件库Element UI 的使用

    组件库 前言 这篇文章介绍vue组件库! 介绍什么是组件库以及Element UI组件库的使用! 看完不会你打我.哈哈哈,开玩笑的,不多说,上刺刀!! 1. 什么是 vue 组件库 在实际开发中,前端 ...

  2. Vue UI组件库(Element UI库)

    1 移动端常用 UI 组件库 1. Vant Vant 4 - 轻量.可定制的移动端组件库 (vant-ui.github.io)  2. Cube UI cube-ui Document (didi ...

  3. 二次封装Element Ui的Table中使用render渲染函数

    render函数的使用 render在element UI中的使用 render函数是什么 具体参数用法 render在element UI中的使用 {prop: 'button',label: '操 ...

  4. 前端组件库(Element UI)的实现原理:教你如何实现自定义组件库,并打包发布至npm

    前端组件库实现原理 前言 Demo地址 一. 组件库开发流程 1)新建vue项目: 2)编写自定义组件,封装成插件: 3)修改配置项 webpack.config.js: pakage.json: 4 ...

  5. element ui table封装组件,render 函数动态事件设置

    接着上一篇讲的,封装element ui table, 支持自定义列的展示和按照指定顺序展示 自定义列需要在引用页面重新写一下,这样就可以定义化了,多数用于一些转换,或者操作列场景下,自行考虑即可,我 ...

  6. Vue UI 组件库(移动端常用 UI 组件库,PC 端常用 UI 组件库,Element UI基本使用,Element UI按需引入)

    文章目录 Vue UI 组件库 7.1 移动端常用 UI 组件库 7.2 PC 端常用 UI 组件库 7.3 Element UI基本使用 7.4 Element UI按需引入 Vue UI 组件库 ...

  7. Element UI(桌面组件库)之 三大灵魂拷问

    1. 什么是Element UI 概述 Element,一套为开发者.设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库 Element UI是基于Vue 2.0的 Element UI 提供 ...

  8. 组件封装 - 轮播图组件

    轮播图组件封装, 我们主要分为三大步来完成: 1. 基本布局 2. 渲染结构 3. 逻辑封装 我们这里封装的轮播图组件和 Element UI 所封装的走马灯组件有所不同 Element UI 是直接 ...

  9. 网站快速成型工具-Element UI

    Element UI Element UI 1 什么是Element UI???? 2 搭建环境 2.1 创建vue项目 2.2 安装 element-ui组件 2.3 Element UI 引入 3 ...

最新文章

  1. HttpClient4.4 登录知乎(详细过程)
  2. 易评:软银收购ARM会扼住中国芯发展的咽喉吗?
  3. 【.NetCore学习】ASP.NET Core EF Core2.0 DB First现有数据库自动生成实体Context
  4. 行转列:SQL SERVER PIVOT与用法解释
  5. 【Linux】一步一步学Linux——wc命令(52)
  6. [QGLViewer]3D场景鼠标点击位置
  7. esc键没反应_有机人名反应——Brown 硼氢化反应(Brown Hydroboration)
  8. 吃货联盟点餐java面向对象_使用面向对象思想编写吃货联盟
  9. 3DShader之法线贴图(normal mapping)
  10. [转]Vs解决方案的目录结构设置和管理
  11. Redis集群环境下分布式锁方案-RedLock算法
  12. 批判性思维_通过批判性反思评估可视化创作系统
  13. wordpress入门主题_WordPress播客入门指南
  14. 手把手教你玩maven脚手架
  15. 【图像处理】基于matlab自动报靶系统(重弹孔)
  16. 计算机常见的运算符,常见运算符
  17. Cisco Packet Tracer 6.0下载安装及汉化包使用方法
  18. Aurora8B10B IP使用 -05- 收发测试应用示例
  19. 【兑吧360】温暖冬日团圆年,贴心好礼迎新春
  20. 软件测试是背锅,测试如何少背锅”

热门文章

  1. 小白如何解决笔记本卡 磁盘占用100
  2. 数字IC面试经验及面试题总结(内附大厂试题)
  3. MySQL5.7.5及以上执行group by报错
  4. 低功耗蓝牙系统体系结构
  5. ​【Python】用 Python 和 Gensim 库进行文本主题识别
  6. 【福利】1024节 活动送书!
  7. 【NOI2022省选挑战赛 Contest11 A】魔法球(二分)
  8. 基础数据模板.xlsx下载
  9. 高通AR摄像机参数详解
  10. Navicat for MySQL连接使用教程