vue-upload 封装组件-上传组件
我后端的,刚接触vue个星期,根据需求写了个上传控件,很灵活的。没有看element el-upload源码,样式用的element的。感觉vue确实好用。
先看样子:
<!-- 单文件上传组件 -->
<template>
<div>
<input type="file" id="file" hidden @change="fileChange" :accept="accept">
<div v-if="upMode=='url'" style="width: 100%;display:inline-flex;">
<el-input :value="path" disabled></el-input>
<el-button size="small" type="primary" @click="btnChange">{{autoUpload?label:'选择文件'}}</el-button>
<el-button v-if="!autoUpload && loadButton" size="small" type="success" @click="uploadClick">{{label}}</el-button>
</div>
<div v-else-if="upMode=='head'" class="upmode-head">
<div class="el-upload el-upload--picture-card" @click="btnChange">
<i v-if="path==''" class="el-icon-plus"></i>
<img v-else :src="path">
</div>
<el-button v-if="!autoUpload && loadButton" size="small" type="success" @click="uploadClick">{{label}}</el-button>
</div>
<div v-else-if="upMode=='variable'" class="el-upload-dragger" @click="btnChange">
<div v-if="path==''">
<i class="el-icon-upload"></i><div class="el-upload__text"><em>{{label}}</em></div>
</div>
<img v-else :src="path">
</div> </div>
</template> <script>
import glob from '@/utils/global.js'
export default {
model: {
prop: 'path',
event: 'onsuccess'
},
props: {
label: {type: String, default: '上传'},//按钮文字
accept: {String,default:'image/jpeg,image/png,image/x-icon'},//预选文件类型
autoUpload:{type:Boolean, default:true},//是否自动上传
loadButton:{type:Boolean, default:true},//手动上传时是否生成上传按钮
path:String,//回显地址
action: {type: String, default: '/api/upload/img'},//传入action可以调用不同接口适应不同文件类型上传
upMode:{type: String, default: 'url'},//上传控件模式url,head,variable
},
methods: {
btnChange() {
var file = document.getElementById('file');
file.click();
},
fileChange(e){
try {
const fu = this.getFile();
if(fu==null)return;
if(!this.beforeUpload(fu))return;
if(this.autoUpload){
this.submit(fu);
}else{
if(this.upMode=='url')return;
//本地预览
var reader = new FileReader();
reader.readAsDataURL(fu);
reader.onload = function(e) {
var src = this.result;
var str = '<img src="'+src+'">';
var target=this.upMode=='head'?'.el-upload--picture-card':'.el-upload-dragger';
var nim = document.querySelector(target);
if(nim) {
nim.innerHTML='';
nim.insertAdjacentHTML("beforeEnd", str)
}
};
} } catch (error) {
console.debug('choice file err:',error);
}
},
beforeUpload(f) {
const maxSzie = glob.Config.UploadSize;
if (f.size/1024/1024 > maxSzie) {
this.$message.error('上传文件大小不能超过'+maxSzie+'M.');
return false;
}
var types = glob.Config.UploadType;
for (let i = 0; i < types.length; i++) {
if(types[i]===f.type) return true;
}
this.$message.error('上传文件格式不允许!');
return false;
},
uploadClick(e){
this.submit();
},
submit(file){
try {
if(!file) file = this.getFile();
if(file==null)return;
var isUpload =true;
this.$emit('onbefore', file);
if(!isUpload)return;
const url =process.env.Store_API + this.action;
var fd = new window.FormData();
// 配置post请求的参数。参数名fileType,值为category(看后端的具体要求)
fd.append('fileType', 'category');
fd.append('file', file);
var xhr = new XMLHttpRequest();
xhr.open('POST', url, true);
xhr.send(fd);
xhr.onload = () => {
if (xhr.status === 200) {
var res = JSON.parse(xhr.responseText);
if(res.code==1) {
var imgurl = glob.StaticStoreHost+res.data;
this.$emit('onsuccess', imgurl);
}else{
this.$message(res.message);
}
}
}
} catch (error) {
console.debug('upload file err:',error);
}
},
getFile(){
var file = document.getElementById('file');
if(file.files.length==0){
this.$message('没有选择文件');
return null;
}
return file.files[0];
},
}, }
</script>
其实就这个小组件就体现到封装、继承、多态的思想,多花时间思考,代码就能简洁、灵活、可用性高。
样式也有重写,需要样式的评论支持下,谢谢。
vue-upload 封装组件-上传组件的更多相关文章
- 微信小程序简单封装图片上传组件
微信小程序简单封装图片上传组件 希望自己 "day day up" -----小陶 我从哪里来 在写小程序的时候需要上传图片,个人觉得官方提供的 Uploader 组件不是太好用, ...
- 从0开始做一个的Vue图片/ 文件选择(上传)组件[基础向]
原文:http://blog.csdn.net/sinat_17775997/article/details/58585142 之前用Vue做了一个基础的组件 vue-img-inputer ,下面就 ...
- vue里图片压缩上传组件
//单图上传 <template> <div> <div class="uploader" v-if='!dwimg'> <van-upl ...
- React后台管理手动封装图片上传组件
分为两个文件夹,index.js(逻辑文件) styled.js(样式文件) index.js文件,编写完成之后在对应的地方引入即可 import React from "react&quo ...
- VUE -- iview table 组件 中使用 upload组件 上传组件 on render 事件不会触发问题
碰到的问题是: upload 组件在 on中写的监听事件不会被触发 在 props 中来监听:==>
- vue.js框架图片上传组件
html: <div id="app"> <div class="hello"> <div class="upload& ...
- 封装Vue Element的upload上传组件
本来昨天就想分享封装的这个upload组件,结果刚写了两句话,就被边上的同事给偷窥上了,于是在我全神贯注地写分享的时候他就神不知鬼不觉地突然移动到我身边,腆着脸问我在干啥呢.卧槽你妈,当场就把我吓了一 ...
- 封装react antd的upload上传组件
上传文件也是我们在实际开发中常遇到的功能,比如上传产品图片以供更好地宣传我们的产品,上传excel文档以便于更好地展示更多的产品信息,上传zip文件以便于更好地收集一些资料信息等等.至于为何要把上传组 ...
- Vue.js 3.0搭配.NET Core写一个牛B的文件上传组件
在开发Web应用程序中,文件上传是经常用到的一个功能. 在Jquery时代,做上传功能,一般找jQuery插件就够了,很少有人去探究上传文件插件到底是怎么做的. 简单列一下我们要做的技术点和功能点 使 ...
随机推荐
- PTA(Basic Level)1028.人口普查
某城镇进行人口普查,得到了全体居民的生日.现请你写个程序,找出镇上最年长和最年轻的人. 这里确保每个输入的日期都是合法的,但不一定是合理的--假设已知镇上没有超过 200 岁的老人,而今天是 2014 ...
- Robot Framework-失败用例自动重跑
使用自动化脚本进行测试,经常受环境影响等各方面导致本能成功的脚本失败,下面介绍了RFS框架下,失败重跑的方法: 通过改写RobotFramework源代码增加–retry选项,实现test级别的失败用 ...
- 并发编程 深入分析Volatile的实现原理
在多线程并发编程中synchronized和Volatile都扮演着重要的角色,Volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”.可见性的意思是当一个线 ...
- %300为0的个数(牛客第四场)-- number
题意: 给你一串数,问你如题. 思路: 我不是这样的作法,从后往前,先取00,再算%3==0的个数,往前推的时候有递推关系: #define IOS ios_base::sync_with_stdio ...
- JS数据结构的栈和队列操作
数据结构:列表.栈.队列.链表.字典.散列.图和二叉查找树! 排序算法:冒牌.选择.插入.希尔.归并和快速! 查找算法:顺序查找和二分查找 在平时工作中,对数组的操作很是平常,它提供了很多方法使用,比 ...
- 十大经典排序算法(Python,Java实现)
参照:https://www.cnblogs.com/wuxinyan/p/8615127.html https://www.cnblogs.com/onepixel/articles/7674659 ...
- Git复习(八)之快速理解Git结构
git pull:拉取远程服务器最新代码到本地(会自动merge) git add:将本地代码添加到暂存区 git commit:将暂存区的所有内容提交到当前分支(git会自动为我们创建第一个分支 ...
- [转载]for、foreach、iterator的用法及效率区别
来源:https://www.jianshu.com/p/bbb220824c9a 1.在形式上 for的形式是 for(int i=0;i<arr.size();i++){...} forea ...
- leetcode 1051. Height Checker
Students are asked to stand in non-decreasing order of heights for an annual photo. Return the minim ...
- Java 计算两点间的全部路径(二)
一.有向线段,存储开始点与结束点 /** * 有方向的线段 * * @author Gm * */ public class DirectionLine implements Cloneable { ...