封装组件el-upload通过v-model (一): 上传单张图片
ElementUI 中的el-upload 上传图片 我进行了二次封装。(默认大家都是有一定的vue基础的,细节就不过多的讲了)
在项目中我们主要拿到图片或者其他的一些参数 ,我这里是上传后返回的Guid,
所以上传的动作我就集中处理了,像 input 的 v-model 直接获取到参数
页面展示代码:
<imgeFile v-model="form.license" allclass="passport-uploader"
inclass="passport-uploader-icon passport-s3" onclass="passport passport-pic">
<div class="el-upload__tip" slot="tip">请上传300*420像素不超过500K大小的图片,图片格式支持.PNG或.JPG</div>
</imgeFile>
效果:
组件代码:
<template>
<el-upload :class="allclass" :accept="accept" :action="fileUrl" :show-file-list="false"
:on-success="handlePassportSuccess" :before-upload="beforePassportUpload">
<!---上传图片后的展示效果 imge是进行封装过的 imageUrl是Guid 统一处理--->
<imge v-if="imageUrl" :src="data:imageUrl" :class="onclass"/>
<!---上传图片前的展示效果--->
<i v-else :class="inclass"></i>
<!---提示--->
<slot name="tip" slot="tip"></slot>
</el-upload>
</template> <script> import { Url, CCONFIG} from "@/api/apiconfig";//上传图片地址
import {getFileUrl} from "@/api/upload"; //获取图片方法
export default {
model:{
prop:"value",
},
props: {
//配合v-model 加载初始值
value: {
type: String,
default: ""
},
//大于多少兆开始压缩
sizeKB:{
type:Number,
default: 100
},
//最大多少兆
maxSizeM:{
type:Number,
default: 5
},
//图片同比压缩比列
scale:{
type:Number,
default: 0.3
},
//上传文件类型
accept:{
type: String,
default: "image/jpeg,image/png"
}, //整体样式
allclass: {
type: String,
default: "passport-uploader-logo"
},
//点击前样式
inclass: {
type: String,
default: "el-icon-plus avatar-uploader-icon"
},
//点击后样式
onclass: {
type: String,
default: "passport-logo"
}, },
data() {
return {
fileUrl: Url.imge_Upload,//上传服务器地址
imageUrl: "",
filelist:[],
};
},
computed: {},
created: function () {
this.imageUrl=this.value
},
mounted() {
},
methods: {
//上传成功返回值
handlePassportSuccess(res, file) {
if (res.code == "0000") {
this.imageUrl=res.data.id;
//返回 v-model的参数(关键)
this.$emit('input', res.data.id)
} else
this.imageUrl = "";
}, //压缩图片 下面的代码都是压缩文件大小
beforePassportUpload(file) {
var that = this;
return new Promise((resolve, reject) => {
const isJPG = file.type === "image/jpeg";
const isPNG = file.type === "image/png";
const kb= file.size/ 1024;
const sizeM= file.size/ 1024/1024;
const isLtKB = kb < this.sizeKB;
let bool = false;
let msg = "";
if ((isJPG || isPNG)&&sizeM<=this.maxSizeM) {//判断是否符合格式要求
bool = true;
}
else
if(sizeM>this.maxSizeM){
var mag="上传文件必须是小于"+this.maxSizeM+"M";
this.$message({message:mag,type:'error',offset:10 });
reject(file);
} else
{
this.$message({message:"上传文件必须是jpg、png格式!",type:'error',offset:10 });
reject(file);
}
if (bool && !isLtKB) {//如果格式符合要求,但是size过大,对图片进行处理
let image = new Image(),
resultBlob = "";
image.src = URL.createObjectURL(file);
image.onload = () => {
resultBlob = that.compressUpload(image);//Blob
resolve(resultBlob);
};
} else if (bool && isLtKB) {
resolve(file);//file
}
});
},
compressUpload(image) {
let canvas = document.createElement("canvas");//创建画布元素
let ctx = canvas.getContext("2d");
let initSize = image.src.length;
let { width } = image,
{ height } = image;
canvas.width = width;
canvas.height = height;
ctx.fillRect(0, 0, canvas.width, canvas.height);
ctx.drawImage(image, 0, 0, width, height);
let compressData = canvas.toDataURL("image/jpeg", this.scale); //等比压缩
let blobImg = this.dataURItoBlob(compressData);//base64转Blob
return blobImg;
},
dataURItoBlob(data) {
let byteString;
if (data.split(",")[0].indexOf("base64") >= 0) {
byteString = atob(data.split(",")[1]);//转二进制
} else {
byteString = unescape(data.split(",")[1]);
}
let mimeString = data
.split(",")[0]
.split(":")[1]
.split(";")[0];
let ia = new Uint8Array(byteString.length);
for (let i = 0; i < byteString.length; i += 1) {
ia[i] = byteString.charCodeAt(i);
}
return new Blob([ia], { type: mimeString });
}, }, };
</script>
QQ交流群:929412850 希望大家一起能够探讨学习
封装组件el-upload通过v-model (一): 上传单张图片的更多相关文章
- TagHelper+Layui封装组件之Radio单选框
TagHelper+Layui封装组件之Radio单选框 标签名称:cl-radio 标签属性: asp-for:绑定的字段,必须指定 asp-items:绑定单选项 类型为:IEnumerable& ...
- Vue 爬坑之路(九)—— 用正确的姿势封装组件
迄今为止做的最大的 Vue 项目终于提交测试,天天加班的日子终于告一段落... 在开发过程中,结合 Vue 组件化的特性,开发通用组件是很基础且重要的工作 通用组件必须具备高性能.低耦合的特性 为了满 ...
- 【ExtJS】关于标准模块化封装组件
在此之前,自己封装自定义控件用的是这样的方式: Ext.define('My.XXX',{ extend: 'Ext.YYY', xtype: 'ZZZ', . . . items:[ ... ] } ...
- AntD框架的upload组件上传图片时使用customRequest方法自定义上传行为
本次做后台管理系统,采用的是 AntD 框架.涉及到图片的上传,用的是AntD的 upload 组件. 我在上一篇文章<AntD框架的upload组件上传图片时使用customRequest方法 ...
- react第七单元(组件的高级用法-组件的组合(children的用法)-高阶组件-封装组件)
第七单元(组件的高级用法-组件的组合(children的用法)-高阶组件-封装组件) #受控组件 简而言之,就是受到状态state控制的表单,表单的值改变则state值也改变,受控组件必须要搭配onc ...
- 基于SqlSugar的数据库访问处理的封装,在.net6框架的Web API上开发应用
我前面几篇随笔介绍了关于几篇关于SqlSugar的基础封装,已经可以直接应用在Winform项目开发上,并且基础接口也通过了单元测试,同时测试通过了一些Winform功能页面:本篇随笔继续深化应用开发 ...
- [Web API] Web API 2 深入系列(6) Model绑定(上)
目录 解决什么问题 Model元数据解析 复杂类型 ValueProvider ValueProviderFactory 解决什么问题 Model: Action方法上的参数 Model绑定: 对Ac ...
- 091 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 01 static关键字(上)
091 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...
- vue 自定义封装组件 使用 model 选项
自定义组件的 v-model 一个组件上的 v-model 默认会利用名为 value 的 prop 和名为 input 的事件,但是像单选框.复选框等类型的输入控件可能会将 value 特性用于不同 ...
随机推荐
- 易学又实用的新特性:for...of
今天带来的知识点既简单又使用,是不是感觉非常的棒啊,OK,不多说了,咱们开始往下看. for...of 是什么 for...of 一种用于遍历数据结构的方法.它可遍历的对象包括数组,对象,字符串,se ...
- 《JAVA8开发指南》使用流式操作
为什么需要流式操作 集合API是Java API中最重要的部分.基本上每一个java程序都离不开集合.尽管很重要,但是现有的集合处理在很多方面都无法满足需要. 一个原因是,许多其他的语言或者类库以声明 ...
- docker配置dns与容器的访问控制(6)
Docker 没有为每个容器专门定制镜像,那么怎么自定义配置容器的主机名和DNS配置?秘诀就是它利用虚拟文件来挂载到容器的3个相关的配置文件. 进入容器内使用mount命令可以看到挂载信息,这种机制可 ...
- Scala教程之:scala的参数
文章目录 默认参数值 命名参数 scala的参数有两大特点: 默认参数值 命名参数 默认参数值 在Scala中,可以给参数提供默认值,这样在调用的时候可以忽略这些具有默认值的参数. def log(m ...
- vuex-persist数据持久化存储插件
Vuex 解决了多视图之间的数据共享问题.但是运用过程中又带来了一个新的问题是,Vuex 的状态存储并不能持久化.也就是说当你存储在 Vuex 中的 store 里的数据,只要一刷新页面,数据就丢失了 ...
- WCF客户端和服务的实现
WCF客户端和服务 ?服务器端: – 定义和实现服务契约 – 为服务类型构建ServiceHost实例,暴露endpoints – 打开通讯通道 ?客户端: – 需要服务契约的一个副本和关于endpo ...
- 百度Openrasp开源的应用运行时自我保护产品,安装教程。
第一步: 下载最新版本的安装包 https://packages.baidu.com/app/openrasp/release/latest/rasp-php-linux.tar.bz2 解压到目录: ...
- 数学--数论--HDU 2582 F(N) 暴力打表找规律
This time I need you to calculate the f(n) . (3<=n<=1000000) f(n)= Gcd(3)+Gcd(4)+-+Gcd(i)+-+Gc ...
- .Net Core中使用Dapper构建泛型仓储
前言:Dapper是.NET的简单对象映射器,在速度方面拥有ORM之王的称号,与使用原始ADO.NET读取数据一样快.ORM是对象关系映射器,它负责数据库和编程语言之间的映射. 仓储主要是用来解耦业务 ...
- MySQL 增删改查(单表)
1.sql 新增语句 表中插入数据 insert into + 表名 values(字段1value1,字段2value1,字段3value1),(字段1value2,字段2value2,字段3val ...