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 相关文章推荐
HTML中事件触发列表与解说
Jul 09 Javascript
40个有创意的jQuery图片、内容滑动及弹出插件收藏集之一
Dec 31 Javascript
window.requestAnimationFrame是什么意思,怎么用
Jan 13 Javascript
JQUERY 设置SELECT选中项代码
Feb 07 Javascript
老生常谈JavaScript数组的用法
Jun 10 Javascript
Bootstrap轮播插件简单使用方法介绍
Jun 21 Javascript
vue组件Prop传递数据的实现示例
Aug 17 Javascript
Angularjs渲染的 using 指令的星级评分系统示例
Nov 09 Javascript
浅谈webpack 自动刷新与解析
Apr 09 Javascript
JS解析后台返回的JSON格式数据实例
Aug 06 Javascript
element-ui循环显示radio控件信息的方法
Aug 24 Javascript
判断“命令按钮”是否被鼠标单击详解
Jul 31 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
PHP开发入门教程之面向对象
2006/12/05 PHP
腾讯QQ php程序员面试题目整理
2010/06/08 PHP
PHP生成迅雷、快车、旋风等软件的下载链接代码实例
2014/05/12 PHP
一个不易被发现的PHP后门代码解析
2014/07/05 PHP
php数组函数array_key_exists()小结
2015/12/10 PHP
将PHP的session数据存储到数据库中的代码实例
2016/06/24 PHP
php封装的mysqli类完整实例
2016/10/18 PHP
PHP实现简单注册登录系统
2020/12/28 PHP
如何创建一个JavaScript弹出DIV窗口层的效果
2013/09/25 Javascript
将json对象转换为字符串的方法
2014/02/20 Javascript
javascript比较两个日期的先后示例代码
2014/12/31 Javascript
JS加载iFrame出现空白问题的解决办法
2016/05/13 Javascript
jQuery+ajax实现实用的点赞插件代码
2016/07/06 Javascript
浅谈JS函数节流防抖
2017/10/18 Javascript
ios中视频的最后一桢问题解决
2019/05/14 Javascript
JavaScript剩余操作符Rest Operator详解
2019/07/20 Javascript
vue实现带过渡效果的下拉菜单功能
2020/02/19 Javascript
vue配置多代理服务接口地址操作
2020/09/08 Javascript
通过vue.extend实现消息提示弹框的方法记录
2021/01/07 Vue.js
python中文编码问题小结
2014/09/28 Python
python删除服务器文件代码示例
2018/02/09 Python
Django 数据库同步操作技巧详解
2019/07/19 Python
python3 实现函数写文件路径的正确方法
2019/11/27 Python
使用Puppeteer爬取微信文章的实现
2020/02/11 Python
基于python 凸包问题的解决
2020/04/16 Python
python利用proxybroker构建爬虫免费IP代理池的实现
2021/02/21 Python
详解CSS3选择器的使用方法汇总
2015/11/24 HTML / CSS
Made in Design德国:设计师家具、灯具和装饰
2019/10/31 全球购物
幼儿园教师工作制度
2014/01/22 职场文书
保护动物倡议书
2014/04/15 职场文书
开展党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
年终工作总结范文2014
2014/11/27 职场文书
2015年机关纠风工作总结
2015/05/15 职场文书
十一月早安语录:把心放轻,人生就是一朵自在的云
2019/11/04 职场文书
Django与数据库交互的实现
2021/06/03 Python
【海涛教你打dota】体验一超神发条:咱是抢盾专业户
2022/04/01 DOTA