封装组件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 特性用于不同 ...
随机推荐
- 详解 继承(下)—— super关键字 与 多态
接上篇博文--<详解 继承(上)-- 工具的抽象与分层> 废话不多说,进入正题: 本人在上篇"故弄玄虚",用super();解决了问题,这是为什么呢? 答曰:子类中所有 ...
- mongodb权限篇
1. 权限详解 内建角色: 数据库用户角色: read.readWrite: 数据库管理角色: dbAdmin.dbOwner.userAdmin: 集群管理角色: clusterAdmin.clus ...
- Linux网络编程(1)
Preview 课程要求,所以学了一下UNIX网络编程,老师说挺简单的,实际上手之后才发现这里面关系没那么简单.从CS:APP11章网络编程,再加上不停地man,对当前的学习做个总结,也顺带当个报告了 ...
- thinkphp5--model数据操作的坑
最近用thinkphp5开发,经常用到model了来操作数据,但是操作多了,就发现他的坑了. 就好像如果你只是初始化一个model对象,但是你却用这个对象进行多次的数据操作,这时候他的数据就会发生混乱 ...
- 手把手编写自己的PHP MVC框架实例教程
1 什么是MVC MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式. MVC把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Contro ...
- 2019-2020-1 20199308《Linux内核原理与分析》第六周作业
<Linux内核分析> 第五章 系统调用的三层机制(下) 5.1 给MenuOS增加命令 强制删除当前menu目录,用get clone重新克隆一个新版本的menu,运行make root ...
- Python 删除含有只读文件(夹)的文件夹
def rm_read_only(fn, tmp, info): if os.path.isfile(tmp): os.chmod(tmp, stat.S_IWRITE) os.remove(tmp) ...
- vue 开发规范
本文档为前端 vue 开发规范 规范目的 命名规范 结构化规范 注释规范 编码规范 CSS 规范 规范目的 为提高团队协作效率 便于后台人员添加功能及前端后期优化维护 输出高质量的文档 命名规范 为了 ...
- Vue Cli 报错:You are using the runtime-only build of Vue where the template compiler is not availabl
报错原因: 这里引用的是vue.runtime.esm.js,造成的不能正常运行. vue-cli 2.x 解决方法: 在webpack.base.conf.js配置文件中多加了一段代码,将 vue/ ...
- Linux 开发之线程条件锁那些事
2019独角兽企业重金招聘Python工程师标准>>> 条件锁即在一定条件下触发,那什么时候适合用条件锁呢,那当然是你在等待一个符合的条件下触发.一个常用的例子就是在线程中无限循环执 ...