vue图片上传组件使用详解


Posted in Javascript onDecember 23, 2019

vue图片上传组件,供大家参考,具体内容如下

最近在做项目的时候顺便补充了一下公司项目的公共组件库,刚刚手头事情告一段落,就来做个笔记。

首先来看看最终效果

1.不允许删除

 vue图片上传组件使用详解

vue图片上传组件使用详解

2.允许用户删除(显示删除按钮)

vue图片上传组件使用详解

实现的效果就是上图显示内容

接下来说说组件布局那部分直接上代码了

<template>
 <div class="uploadImg">
 <div class="upload-content">
  <div class="upload-title">
  <p>{{upTitle}}</p>
  <p class="show-num">{{upNum}}/{{uploadNum}}</p>
  </div>
  <ul class="img-list">
  <li class="show-img" v-for="(item, index) in imgList" :key="index">
   <img :src="item" alt="">
   <kk-icon :class="isDel == true ? '' : 'hide-del'" name="error" color="#FF685D" size="0.4rem" @click.native="delImg(index)"></kk-icon>
  </li>
  <div class="uploadSec">
   <img :src="globalPath+'img/insurance/upload.png'" alt="上传图标">
   <input type="file" value="" id="choose" @change='onUpload' multiple>
  </div>
  </ul>
 </div>
 </div>
</template>

上面代码中的kk-icon是自定义的图标组件,只是多了个接受颜色和大小的功能,你们自己写一个替换就行了。然后动态定义它的class,实现显隐就结束了。

随手贴个样式

<style lang="less" type="text/less" rel="stylesheet/less">
 .uploadImg{
 text-align: left;
 .upload-content{
  margin-left: 0.3rem;
  .upload-title{
  display: flex;
  justify-content: space-between;
  padding: 0.3rem 0.3rem 0.3rem 0;
  .show-num{
   color: #c9c9c9;
  }
  }
  .img-list{
  display: inline-block;
  margin: 0.6rem 0.3rem 0.3rem 0;
  .show-img{
   position: relative;
   display: inline-block;
   margin-right: 0.12rem;
   height: 1.3rem;
   width: 1.3rem;
   img{
   width: 100%;
   height: 100%;
   }
   .hide-del{
   display: none;
   }
   .yd-icon-error{
   position: absolute;
   top: 0;
   right: 0;
   }
  }
  .uploadSec{
   position: relative;
   display: inline-block;
   width: 1.3rem;
   height: 1.3rem;
   overflow: hidden;
   img{
   width: 100%;
   height: 100%;
   }
   #choose{
   position: absolute;
   height: 100%;
   left: 0;
   top: 0;
   opacity: 0;
   }
  }
  }
 }
 }
</style>

接下来看看实现逻辑

借助input type="file"实现图片选择,是否允许多选图片的话是通过给input的multiple属性。(其他直接备注在里面了)
在组件中接收父组件传来的图片数量限制,是否开启删除操作,上传图片地址,预览地址等

props: ['imgNum','title','upUrl','showUrl','showDel'],

title 上传组件的标题
imgNum 上传图片数量限制
upUrl 设置上传图片地址
showUrl设置图片回显地址
showDel是否允许删除图片
changeNum 图片改变时,触发父组件中的方法

当选择图片确定后就会触发change,因此我在@change="onUpload" 进行上传,上传使用了formData

// 上传操作
onUpload (e) {
 let photoFile = e.target
 let val = e.target.value
 // 判断是否符合上传条件
 if (photoFile.files.length === 0) return false
 for (let i = 0; i < photoFile.files.length; i++) {
 this.fileAdd(photoFile.files[i],i)
 }
}

上传操作中触发图片后续处理方法fileAdd

因为后台要求拿到的图片地址是一串字符串,所以我在下面中使用join() 进行数组转化处理(因为后台不支持接受图片数组,因此我这个上传多选图片之后上传也是单张上传)

// 添加图片
fileAdd (file,index) {
 let csrf_token = this.getCookie('XSRF-TOKEN');
 let formFile = new FormData();
 let imgName = 'img0';
 formFile.append(imgName, file);
 formFile.append("_token", csrf_token);
 let name = file.name
 let size = file.size
 let types = '.jpg,.jpeg,.png,.gif' //文件格式
 let fileExt = name.substring(name.lastIndexOf('.')).toLowerCase()
 let result = types.indexOf(fileExt)
 if (result < 0) {  //验证图片格式
 this.$dialog.toast({
  mes: '图片格式不正确',
  timeout: 1000
 })
 return false
 }
 if (size > 1 * 1024 * 1024) {
 this.$dialog.toast({
  mes: '图片大小不能大于1M',
  timeout: 1000
 })
 return false
 }
 if (this.fileList.length >= this.uploadNum) {
 this.$dialog.toast({
  mes: '图片最多只能上传' + this.uploadNum + '张',
  timeout: 1000
 })
 return false
 }

 axios.post(this.upUrl,formFile)
 .then((res) => {
  this.upNum = this.fileList.length + 1; //计算图片数量
  this.fileList.push(file);    //添加进图片数组
  let imgUrl = this.showUrl + res.data.data; //图片回显地址
  let upImg = res.data.data;    //传给后台的图片地址
  this.imgList.push(imgUrl);
  this.upImgList.push(upImg);
  let upImgAll = this.upImgList.join(',');
  this.$emit('input', upImgAll);
 }).catch((err) => {
  console.log(err);
 })
},

删除图片操作

我这删除仅仅是对最后提交的图片数组进行处理,并未对上传到图片服务器上的图片进行移除处理

// 删除图片
delImg (index) {
 this.imgList.splice(index, 1);
 this.fileList.splice(index, 1);
 this.upNum = this.imgList.length;
 let imgAll = this.imgList.join(',');
 this.$emit('input', imgAll);
},

最后我在组件中监听了图片改变

watch: {
 imgList () {
  this.$emit('changeNum'); //触发父组件中验证资料是否完整的方法
 }
 },

就是这样了,一个简易的上传组件(写的不是很好,轻喷),还有可以优化的地方,后面改完再看看吧

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript中的Array数组对象详谈
Mar 03 Javascript
自己动手手写jQuery插件总结
Jan 20 Javascript
jQuery菜单插件superfish使用指南
Apr 21 Javascript
JS非Alert实现网页右下角“未读信息”效果弹窗
Sep 26 Javascript
轻松实现js选项卡切换效果
Sep 24 Javascript
利用yarn实现一个webpack+react种子
Oct 25 Javascript
实现一个简单的vue无限加载指令方法
Jan 10 Javascript
layui导航栏实现代码
May 19 Javascript
微信小程序之网络请求简单封装实例详解
Jun 28 Javascript
聊聊Vue.js的template编译的问题
Oct 09 Javascript
微信小程序框架wepy之动态控制类名
Sep 14 Javascript
node中IO以及定时器优先级详解
May 10 Javascript
微信小程序实现签字功能
Dec 23 #Javascript
使用JS location实现搜索框历史记录功能
Dec 23 #Javascript
vue实现移动端图片上传功能
Dec 23 #Javascript
vue实现拖拽效果
Dec 23 #Javascript
JQuery常用选择器功能与用法实例分析
Dec 23 #jQuery
Jquery属性的获取/设置及样式添加/删除操作技巧分析
Dec 23 #jQuery
JQuery中DOM节点的操作与访问方法实例分析
Dec 23 #jQuery
You might like
Linux编译升级php的详细方法
2013/11/04 PHP
基于php和mysql的简单的dao类实现crud操作功能
2014/01/27 PHP
select 控制网页内容隐藏于显示的实现代码
2010/05/25 Javascript
Jquery 的outerHeight方法使用介绍
2013/09/11 Javascript
解析页面加载与js函数的执行 onload or ready
2013/12/12 Javascript
javascript搜索框点击文字消失失焦时文本出现
2014/09/18 Javascript
AngularJS初始化过程分析(引导程序)
2014/12/06 Javascript
JavaScript中isPrototypeOf函数作用和使用实例
2015/06/01 Javascript
jQuery结合AJAX之在页面滚动时从服务器加载数据
2015/06/30 Javascript
结合代码图文讲解JavaScript中的作用域与作用域链
2016/07/05 Javascript
JQuery PHP图片在线裁剪实例
2020/07/27 Javascript
vue.js 获取select中的value实例
2018/03/01 Javascript
react中实现搜索结果中关键词高亮显示
2018/07/31 Javascript
Vue开发实现吸顶效果的示例代码
2018/08/21 Javascript
解决vue 打包发布去#和页面空白的问题
2018/09/04 Javascript
vue中的watch监听数据变化及watch中各属性的详解
2018/09/11 Javascript
vue实现pdf导出解决生成canvas模糊等问题(推荐)
2018/10/18 Javascript
浅谈Vue数据响应思路之数组
2018/11/06 Javascript
通过js给网页加上水印背景实例
2019/06/17 Javascript
JavaScript对象原型链原理解析
2020/01/22 Javascript
浅谈django orm 优化
2018/08/18 Python
python中class的定义及使用教程
2019/09/18 Python
Python实现栈和队列的简单操作方法示例
2019/11/29 Python
python实现猜拳游戏
2020/03/04 Python
Css3新特性应用之视觉效果实例
2016/12/12 HTML / CSS
生产车间主管岗位职责
2013/12/28 职场文书
中专生自我鉴定范文
2014/02/02 职场文书
年会搞笑主持词串词
2014/03/24 职场文书
代理协议书范本
2014/04/22 职场文书
村主任“四风”问题个人对照检查材料思想汇报
2014/10/02 职场文书
学生打架检讨书
2014/10/20 职场文书
2015年宣传部部长竞选演讲稿
2014/11/28 职场文书
2015年高三毕业班班主任工作总结
2015/10/22 职场文书
使用GO语言实现Mysql数据库CURD的简单示例
2021/08/07 Golang
Android开发实现极为简单的QQ登录页面
2022/04/24 Java/Android
Java获取字符串编码格式实现思路
2022/09/23 Java/Android