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图片上传前的本地预览实例
Jun 16 Javascript
$.each遍历对象、数组的属性值并进行处理
Jul 18 Javascript
Jquery中find与each方法用法实例
Feb 04 Javascript
JavaScript使用位运算符判断奇数和偶数的方法
Jun 01 Javascript
获取今天,昨天,本周,上周,本月,上月时间(实例分享)
Jan 04 Javascript
详解angularjs中如何实现控制器和指令之间交互
May 31 Javascript
基于zepto.js实现手机相册功能
Jul 11 Javascript
JS中通过url动态获取图片大小的方法小结(两种方法)
Oct 31 Javascript
初探Vue3.0 中的一大亮点Proxy的使用
Dec 06 Javascript
Vue中多个元素、组件的过渡及列表过渡的方法示例
Feb 13 Javascript
ES6中Set和Map数据结构,Map与其它数据结构互相转换操作实例详解
Feb 28 Javascript
Vue使用富文本编辑器Vue-Quill-Editor(含图片自定义上传服务、清除复制粘贴样式等)
May 15 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实现的随机红包算法示例
2017/08/14 PHP
JavaScript 基于原型的对象(创建、调用)
2009/10/16 Javascript
FireFox下XML对象转化成字符串的解决方法
2011/12/09 Javascript
兼容ie、firefox的图片自动缩放的css跟js代码分享
2013/08/12 Javascript
jquery+ajax实现跨域请求的方法
2015/01/20 Javascript
浅析Node.js中使用依赖注入的相关问题及解决方法
2015/06/24 Javascript
实例讲解jquery中mouseleave和mouseout的区别
2016/02/17 Javascript
js变量提升深入理解
2016/09/16 Javascript
利用Node.js+Koa框架实现前后端交互的方法
2017/02/27 Javascript
JS实现元素上下左右移动效果
2017/10/18 Javascript
vuejs前后端数据交互之从后端请求数据的实例
2018/08/11 Javascript
微信小程序按钮去除边框线分享页面功能
2018/08/27 Javascript
jQuery点击页面其他部分隐藏下拉菜单功能
2018/11/27 jQuery
JS拖拽排序插件Sortable.js用法实例分析
2019/02/20 Javascript
Python版实现微信公众号扫码登陆
2020/05/28 Javascript
基于Echarts图表在div动态切换时不显示的解决方式
2020/07/20 Javascript
vue-cli3中配置alias和打包加hash值操作
2020/09/04 Javascript
微信小程序实现单个或多个倒计时功能
2020/11/01 Javascript
微信小程序实现下拉加载更多商品
2020/12/29 Javascript
python实现数通设备端口监控示例
2014/04/02 Python
Python合并两个字典的常用方法与效率比较
2015/06/17 Python
python验证码识别的实例详解
2016/09/09 Python
简单易懂的python环境安装教程
2017/07/13 Python
python3+PyQt5重新实现QT事件处理程序
2018/04/19 Python
Python单元测试实例详解
2018/05/25 Python
python使用Matplotlib绘制分段函数
2018/09/25 Python
python绘制分布折线图的示例
2020/09/24 Python
python把一个字符串切开的实例方法
2020/09/27 Python
加拿大时尚床上用品零售商:QE Home | Quilts Etc
2018/01/22 全球购物
总会计师岗位职责
2014/02/19 职场文书
元旦寄语大全
2014/04/10 职场文书
红头文件任命书范本
2014/06/05 职场文书
环境监测与治理技术专业求职信
2014/07/06 职场文书
政风行风评议整改方案
2014/09/15 职场文书
国际贸易实务实训报告
2014/11/05 职场文书
招标保密承诺书
2015/01/20 职场文书