前言:

用vue实现上传图片功能,效果图如下:

先说文件上传控件样式美化怎么做,我有两种方法。

1.先上代码

html部分:

<div class="pics-wrapper">
<div class="addimg-bg">
<input type="file" name="uploadImg" class="ipt-file" @change="fileInput">
</div>
<ul class="imgshow">
<li v-for="(item, index) in showImg">
<img :src="item.url">
<i class="icon-del" @click="imgDel(item.id)"></i>
</li>
</ul>
</div>

CSS(scss)代码如下:

.addimg-wrapper {
border: 1px solid #dfdfdf;
border-top:;
height: 153px;
padding: 25px;
.pics-wrapper {
.addimg-bg {
float: left;
background: url(../static_img/btn-addpic.png) no-repeat center center;
width: 78px;
height: 78px;
}
.ipt-file {
width: 78px;
height: 78px;
padding:;
border:;
opacity:;
}
.imgshow {
float: left;
height: 76px;
font-size:;
li {
display: inline-block;
width: 76px;
height: 76px;
background-color: #eee;
border: 1px solid #dfdfdf;
margin-left: 5px;
position: relative;
img {
width: 100%;
height: 100%;
}
.icon-del {
display: inline-block;
position: absolute;
right:;
top:;
width: 16px;
height: 16px;
background: url(../static_img/icon-del.png) no-repeat center center;
}
}
}
}
}

给input标签外面包一层背景,加号框作为背景,input设置透明度为0

图片素材如下:

btn-addpic.png

icon-del.png

js代码如下:

<script>

new Vue({
el: '#page-publish',
data: {
msg: 'hello world',
imgData: {
accept: 'image/gif, image/jpeg, image/png, image/jpg'
},
showImg: []
},
methods: {
// 添加并上传图片
fileInput(e) {
let img1 = e.target.files[0]
let type = img1.type
let size = img1.size
if (this.imgData.accept.indexOf(type) === -1) {
alert('请选择我们支持的图片格式!')
return false
}
if (size > 3145728) {
alert('请选择3M以内的图片!')
return false
}
let fd = new FormData()
fd.append('Filedata', img1, img1.name)
axios.post('<{url action=toputil_ctl_uploads@uploads}>', fd, {
headers: {
'Content-Type': 'multipart/form-data'
}
}).then(res => {
const data = res.data.data
this.showImg.push(data)
}).catch(err => {
console.log(err)
})
},
}
})

</script>

关键点:

  1. 上传文件file控件的e对象里面有很多信息,其中要用到 e.target.files
  2. new FormData()
  3. 请求头header
  4. 请求成功返回的数据存入data中的showImg, v-for循环渲染即可。

但是我需要限制图片数量。最多5张。我可以把这个判断逻辑直接写在fileInput()方法里,但是只要一点击input,就会打开文件选择框,而后才执行fileInput方法里面的代码。这样非常不优雅。所以请看第二种方法。

2.美化上传文件控件第二种方法

Html部分:

<div class="pics-wrapper">
<div class="addimg-bg" @click="addImg"></div>
<ul class="imgshow">
<li v-for="(item, index) in showImg">
<img :src="item.url">
<i class="icon-del" @click="imgDel(item.id)"></i>
</li>
</ul>
<input ref="file" type="file" name="uploadImg" class="ipt-file" @change="fileInput">
</div>

CSS代码不变。

Html代码的变化在于单独使用一个div容器显示加号框,和input控件分离。

现在问题是点击加号框的时候如何触发input的change事情,以前用jquery很容易实现的,

jquery版代码:

$(function(){
$('input').click(function(){
// do something
})
$('a').click(function(){
$('input').click() // 触发input click事件
})
})

但这是vue啊!!!

我查了好久,终于...

解决方法如下:

(1)给input加上ref="file"

<input ref="file" type="file" name="uploadImg" class="ipt-file" @change="fileInput">

(2)js代码,在vue methods中添加如下代码

    // 触发添加图片
addImg () {
if (this.showImg.length >= 5) {
alert('晒图仅限5张~')
return
}
this.$refs.file.click()
},
this.$refs.file.click()

这句是关键。

这样就实现了点击加号框,先判断数量,再触发input控件点击事件。

到这里,添加图片功能实现了,效果如下:

数量超过5张时:

3.删除图片功能

vue methods 中添加如下方法:

// 删除图片
imgDel(id) {
axios.post('<{url action=toputil_ctl_uploads@deletePic}>', { id: id }).then(res => {
console.log(res)
const data = res.data
if (data.success) {
this.showImg = this.showImg.filter((n) => {
return n.id !== id
})
} else {
alert(data.msg)
}
})
}

细节没什么要说的,传入要删除的图片id,接口请求成功后,删除相应的数据,用filter方法过滤掉数据。这功能用vue实现还是相当方便。

该页面其他功能,我会另写博文。到时再贴链接。

-----玩-----

我写技术博客的目的主要是整理自己做过的功能,主要是写给自己看,当然,我尽量写清楚。

若给你造成误解,我很抱歉。若给你带来帮助, 我很欣慰。

有疑问欢迎交流 扣扣:2136946914

Vue实现上传图片功能的更多相关文章

  1. 使用.Net Core+IView+Vue集成上传图片功能

    最近的项目里有上传图片的功能,当然这个功能在项目里是必须要有的,那么目前这个项目是使用完全的前后端分离,在选择文件上传的组件中还是选择了全面支持Vue的IView,任何上传图片都是通过HTTP请求,服 ...

  2. 中小研发团队架构实践之生产环境诊断工具WinDbg 三分钟学会.NET微服务之Polly 使用.Net Core+IView+Vue集成上传图片功能 Fiddler原理~知多少? ABP框架(asp.net core 2.X+Vue)模板项目学习之路(一) C#程序中设置全局代理(Global Proxy) WCF 4.0 使用说明 如何在IIS上发布,并能正常访问

    中小研发团队架构实践之生产环境诊断工具WinDbg 生产环境偶尔会出现一些异常问题,WinDbg或GDB是解决此类问题的利器.调试工具WinDbg如同医生的听诊器,是系统生病时做问题诊断的逆向分析工具 ...

  3. JAVA 上传图片功能

    前后端实现上传图片功能(JAVA代码) 1.前端大概 请求头必须为AJAX请求头: 'X-Requested-With': 'XMLHttpRequest' 一般是指网页中存在的Content-Typ ...

  4. MVC ueditor的使用(实现上传图片功能)

    之前使用ckeditor不能实现上传图片功能,只要是我不知道怎么使用啦o( ̄ε ̄*),然后就换了ueditor~~,可以实现上传图片功能啦~\(≧▽≦)/~~ 下面是我的步骤:去官网下载最新版uedi ...

  5. aspx页面中用Input 标签实现上传图片功能

    实现上传图片功能需单独的建立一个aspx页面, 其中前台页面需要注意两点: a)实现上传功能的input的type="file" b)设置请求报文头为 enctype=" ...

  6. Vue.js 基本功能了解

    一.写在前面 隔了这么久才来出Vue的第二篇文章,真是堕落了,自己先惩罚下/(ㄒoㄒ)/~~ 回过头看自己第一篇相关文章<初试 Vue.js>(http://www.cnblogs.com ...

  7. Vue.js 基本功能了解一下~

    一.写在前面 隔了这么久才来出Vue的第二篇文章,真是堕落了,自己先惩罚下/(ㄒoㄒ)/~~ 回过头看自己第一篇相关文章<初试 Vue.js>(http://www.cnblogs.com ...

  8. WCF实现上传图片功能

    初次学习实现WCF winform程序的通信,主要功能是实现图片的传输. 下面是实现步骤: 第一步: 首先建立一个类库项目TransferPicLib,导入wcf需要的引用System.Service ...

  9. sql server 关于表中只增标识问题 C# 实现自动化打开和关闭可执行文件(或 关闭停止与系统交互的可执行文件) ajaxfileupload插件上传图片功能,用MVC和aspx做后台各写了一个案例 将小写阿拉伯数字转换成大写的汉字, C# WinForm 中英文实现, 国际化实现的简单方法 ASP.NET Core 2 学习笔记(六)ASP.NET Core 2 学习笔记(三)

    sql server 关于表中只增标识问题   由于我们系统时间用的过长,数据量大,设计是采用自增ID 我们插入数据的时候把ID也写进去,我们可以采用 关闭和开启自增标识 没有关闭的时候 ,提示一下错 ...

随机推荐

  1. python-实现xml字符串替换功能

    今天遇到一个问题,说的是要把一个android res目录下,所有name=xx的字符串的值,自己参照网上的方法,写了一个脚本.记录如下,方便以后使用 #!/usr/bin/python # -*- ...

  2. 调用google翻译

    1. [代码]maven依赖     ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <dependency>     <groupId>org.a ...

  3. es6 --- var const let

    var  const   let  区别 今天第一次遇到const定义的变量,查阅了相关资料整理了这篇文章.主要内容是:js中三种定义变量的方式const, var, let的区别. 1. const ...

  4. ubuntu下eclipse java ee首次打开提示找不到jdk的问题

    最近想搭建一个本地服务器,方便写一些网络请求相关的demo,遂下载了eclipse  ee版 ( IDEA证书好贵,暂时不想买-=-),下载---解压 一切正常,但是当在terminal下打开ecli ...

  5. Android Gson解析json工具类封装

    package com.springSecurity.gson; import java.util.ArrayList; import java.util.List; import java.util ...

  6. XML学习总结(1)——XML入门

    一.XML语法学习 学习XML语法的目的就是编写XML 一个XML文件分为如下几部分内容: 文档声明 元素 属性 注释 CDATA区 .特殊字符 处理指令(processing instruction ...

  7. Python学习(三) 八大排序算法的实现(下)

    本文Python实现了插入排序.基数排序.希尔排序.冒泡排序.高速排序.直接选择排序.堆排序.归并排序的后面四种. 上篇:Python学习(三) 八大排序算法的实现(上) 1.高速排序 描写叙述 通过 ...

  8. 33.Node.js 文件系统fs

    转自:http://www.runoob.com/nodejs/nodejs-module-system.html Node.js 提供一组类似 UNIX(POSIX)标准的文件操作API. Node ...

  9. Wiz+360云盘,让你的知识库井井有条

    用了wiz快两年了,一些同事看到我在找资料时打开wiz,总会好奇的问这是什么,想到还有很多同仁在用文件夹管理知识库,于是想分享一下我的管理方法.(PS:鄙人愚见,如有高见,望指教) Wiz为知笔记下载 ...

  10. 我的第一个JS组件-跨浏览器JS调试工具

    武汉九天鸟-p2p网贷系统开发-互联网应用软件开发 公司官网:http://jiutianniao.com  社交问答:http://ask.jiutianniao.com 最近,在看公司一个JS大牛 ...