VUE2.0+VUE-Router做一个图片上传预览的组件
7-4更新 => 已将本次项目上传至 githulb/lonhon 欢迎大家下载,以后做的新东西也都会更新在上面。
之前发了一篇关于自己看待前端组件化的文章,但是由于学习和实践的业务逻辑差异,所以自己练习的一些demo逻辑比较简单,打算用vue重构现在公司做的项目,所以在一些小的功能页面上使用vue来做的,现在写的这个是项目中用户反馈功能而来的,收获还是挺多的。
收获:dom操作=>数据操作 router的使用 组件的使用,具体总结放在尾部。
- 功能:1.上传图片
- 2.显示缩略图
- 3.可以删除
先上成品图(主要抽取图片这块),自己在家主要做的功能,样式就不计较了。

先上文件目录

由于测试demo,结构基本和VUE初始化生成的目录一致,这里把Hello文件作为了这次组件开发的文件,App文件是主文件。这里自己理解的vue文件:是组件,也是页面。所以在定义的时候得根据实际情况来做路由还是组件。
因为产品给的图上面要求有5个按钮,意味着只能选5个文件,这里如果用原来的思维来做的话,就是放5个input进去,但是现在用vue来做了,肯定得用v-for,不然太low了。先看看html部分

使用ul列表作为input的容器,然后在li中使用v-for循环mmm对象,生成5个初始框。
img就是预览时候需要用到的了,使用v-if根据item.data是否为空来渲染,而src就是item.data
input就是上传的了,在它的change事件中实现我们的主要功能, ps:实际业务使用中应该还要指定name,并且item.name应该是相同的,这样提交给后台的时候才能更好读取。
span用于删除item.data,
现在看看data部分:

其中的mmm数组初始有5个子对象(因为需要5个固定的选择框),name为自己定义,data用于存放图片上传后的base64,还有一个flag用于判断是否上传成功的。现在看看效果

OK,已经得到了5个选择器,样式方面主要思路是将input设置为行内块级元素然后宽高100% 完全透明,比较简单,现在来实现预览效果,
预览效果主要使用的是H5新功能 fileReader 实现,
思路:在input指定change事件触发pushImg方法,接受两个参数,一个是event,一个index
在v-for循环渲染li的时候,使用的是v-for="(item,index) in mmm" ,其中item就是mmm数组的元素,index就是元素的下标,这里具体可以看官方的文档
现在来看pushImg方法:

在pushImg内部let了4个变量
mm指向data中的mmm,因为需要在reader.onload中用到,如果直接this.mmm会由于闭包取到reader.onloadg的this
flag用于标记上传成功,因为要做一个上传成功的提示
flie指向input
reader就是我们预览图片需要用到的了,这是一个H5的新接口,具体的使用手册点击 这里
在reader.onload中,我们将读取到的result也就是图片的base64码放入mmm[i].data
还设置了个定时器改变flag的值,实现成功提示的效果
ps:reader.onload是一个异步操作,所以result要么在它内部传出去,要么用回调或者promise传出去。
现在上传一个图片看看效果

已经ok,现在来做最后一步——删除图片
span中已经指定了click事件为delImg,来看看代码:

主要做的就是清空所点击的选择器的文件了

现在来一遍完整的流程:

小功告成,接下来说说使用vue-router把这个页面路由到其它页面中,要使用首先要安装这个模块,在项目目录下使用cnpm install vue-router就行
还是先说下大致步骤:
1.制作页面(这点上面已经做好了,就是我们的Hello文件)
2.配置路由
3.在页面中展示
直接来第2步,如果了解实体路由器的应该知道路由器中都有一个路由表,这里我建立了一个route.js,就类似于路由器中的路由表。
在route.js中,引入Vue、vue-router、和需要路由的组件Hello,图中的
import Hello from '@/components/Hello' 这里@相当于我配置的一个src目录的缩写而已,如果不会不用管,按照正常路径写就行。 下图中的path就是一个路径,在后面要用到,name相当于一个别名,component就是对应组件了。

按照上图,我们就创建了一个路由表,建立好之后我们需要在主入口把路由表挂载上去。这里项目的主入口main.js,
进入main.js,这里就引入上面配置好的路由表route.js,和程序的主模块App,可以看到我们的Vue实例是挂载到App中的。
接下来在App.vue中展示了,由于是静态路由,所以主要配置template模块,继续上配置图
图中圈出来的第一部分,就类似于我们的a标签,只不过vue-router使用router-link标签封装了,值得一提的是,router-link标签只是起到一个包裹的作用,并没有实际的html意义,里面可以放各种内容。
第二部分就是我们要展示的舞台了,<router-view></router-view> 就是我们的路由的模块需要映射的地方,现在来测试一下是否成功。

注意我们的地址栏的变化,从localhost:8080变成了localhost:8080/#/hhh,也就是说这次路由跳转成功。
现在来做组件引入到页面中
将Hello作为组件放在App中,其实只要其它页面引用了该组件,就可以使用,并不局限于App。
我们先在App.vue文件中的script部分将Hello引入,并注册该组件

接下来在template部分将组件放进去,我们来把他放在顶部。

现在来看看效果,如图页面中已经渲染出了该模块
现在我们来看看router和作为模块引入的结合效果。
现在能看到组件部分和路由进去的部分都能够正常运行,至此我们的功能就算全部完成了。 总结: 数据驱动的魔力实在太大,就拿图片上传来说,我们在实际操作中其实只是对data中的mmm进行了赋值操作,然后将值绑定在dom节点上,通过双向绑定就实现了对DOM的操作,特别是现在的网站项目中,大部分都是处理数据,比如电商之类的网站。其实在用VUE做这个上传功能之前我已经用传统的jQuery写出了这个插件,从手段上来说,jQuery做的就是操纵DOM节点,设置各个DOM节点的ID,然后js再通过ID取到对应的节点,给DOM绑上事件或者取出DOM的值,需要写大量的html代码和js代码;在VUE中,使用一个v-for就可以渲染出多个想要的内容。从复用性来说,我们这次做的这个上传图片功能就已经是一个组件了,我们不仅仅可以在App.vue中使用它。像这次的Hello,我们不仅可以使用路由把它作为一个新的页面,也可以使用component把他作为组件,也就是说,只要业务需要,我们可以选择合理的方式复用我们已经写好的东西。
特别需要注意的就是,使用angular或者vue这种数据驱动视图的框架,我们需要将原来的操纵DOM的思维转变为操纵数据。这点可能需要我们的抽象能力,将需要操作的对象封装成结构合理的数据。
VUE2.0+VUE-Router做一个图片上传预览的组件的更多相关文章
- 简单的做一个图片上传预览(web前端)
转载:点击查看原文 在做web项目很多的时候图片都是避免不了的,所以操作图片就成了一个相对比较棘手的问题,其实也不是说很麻烦,只是说上传然后直接预览的过程很恶心,今天简单的做一个处理. 效果预览: & ...
- ASP.NET工作笔记之一:图片上传预览及无刷新上传
转自:http://www.cnblogs.com/sibiyellow/archive/2012/04/27/jqueryformjs.html 最近项目里面涉及到无刷新上传图片的功能,其实也就是上 ...
- js实现图片上传预览及进度条
原文js实现图片上传预览及进度条 最近在做图片上传的时候,由于产品设计的比较fashion,上网找了比较久还没有现成的,因此自己做了一个,实现的功能如下: 1:去除浏览器<input type= ...
- 模拟QQ心情图片上传预览
出于安全性能的考虑,目前js端不支持获取本地图片进行预览,正好在做一款类似于QQ心情的发布框,找了不少jquery插件,没几个能满足需求,因此自己使用SWFuplad来实现这个图片上传预览. 先粘上以 ...
- 用html5文件api实现移动端图片上传&预览效果
想要用h5在移动端实现图片上传&预览效果,首先要了解html5的文件api相关知识(所有api只列举本功能所需): 1.Blob对象 Blob表示原始二进制数据,Html5的file对象就继 ...
- signup图片上传预览经常总结
html <html> <head> <meta charset="utf-8" /> <meta http-equiv="X- ...
- 兼容好的JS图片上传预览代码
转 : http://www.codefans.net/articles/1395.shtml 兼容好的JS图片上传预览代码 (谷歌,IE11) <html xmlns="http:/ ...
- [前端 4] 使用Js实现图片上传预览
导读:今天做图片上传预览,刚开始的做法是,先将图片上传到Nginx,然后重新加载页面才能看到这个图片.在这个过程中,用户一直都看不到自己上传的文件是什么样子.Ps:我发现我真的有强迫症了,都告诉我说不 ...
- 12-tinyMCE文本编辑器+图片上传预览+页面倒计时自动跳转
文本编辑器插件:1.将tinymce文件夹全部复制到webContent下2.tinymce/js目录下放 jquery等三个js文件3.语言包:tinymce/js/tinymce/langs目录下 ...
随机推荐
- ar1220f-s四条拨号光纤做的策略路由实现负载均衡
acl number 3001 //内网数据流不需被重定向到外网出口. rule 5 permit ip source 192.168.0.0 0.0.255.255 destination 19 ...
- linux通配符与正则表达式
通配符 * 任意字符,可重复多次 ? 任意字符,重复一次 [] 代表一个字符 举例: [a,b,c] 表示abc中任意一个 通配符的作用是用来匹配文件名的 正则表达式 正则表达式 ...
- 每R一点:层次聚类分析实例实战-dist、hclust、heatmap等(转)
聚类分析:对样品或指标进行分类的一种分析方法,依据样本和指标已知特性进行分类.本节主要介绍层次聚类分析,一共包括3个部分,每个部分包括一个具体实战例子. 1.常规聚类过程: 一.首先用dist()函数 ...
- 刨根究底字符编码之八——Unicode编码方案概述
Unicode编码方案概述 1. 前面讲过,随着计算机发展到世界各地,于是各个国家和地区各自为政,搞出了很多既兼容ASCII但又互相不兼容的各种编码方案.这样一来同一个二进制编码就有可能被解释成不 ...
- javascript中break和continue的区别
1.break:跳出循环. 2.continue:跳过循环中的一个迭代.(迭代:重复反馈过程的滑动,其目的是为了逼近所需目标或结果.每一次对过程的重复称为一次"迭代",而每一次迭代 ...
- C++ STL快速入门
在数月之前的机试中第一次体验到STL的威力,因为自己本来一直在用C语言做开发,很多数据结构都是自己造的,比如链表.队列等,第一次接触C++ STL后发现这些数据结构都已经给我提供好了,我直接拿去调用就 ...
- C/C++遍历目录下的所有文件(Windows/Linux篇,超详细)
本文可转载,转载请注明出处:http://www.cnblogs.com/collectionne/p/6815924.html. 前面的一篇文章我们讲了用Windows API遍历一个目录下的所有文 ...
- loadrunner提高篇-结果分析实践
分析图合并 一.分析图合并原理 选择view->merge graphs,弹出如图1所示对话框 图1(设置合并图) 1.选择要合并的图.选择一个要与当前活动图合并的图,注意这里只能选择X轴度量单 ...
- java设计模式面试考点
分类(常见的设计模式) 1.创建型模式 a) 工厂模式 b) 抽象工厂模式 c) 单例模式 d) 建造者模式 2.结构型模式 a) 适配器模式 b) 装饰器模式 c) 桥接模式 d) 代理模式 3.行 ...
- WebSocket+MSE——HTML5 直播技术解析
作者 | 刘博(又拍云多媒体开发工程师) 当前为了满足比较火热的移动 Web 端直播需求,一系列的 HTML5 直播技术迅速的发展起来. 常见的可用于 HTML5 的直播技术有 HLS.WebSock ...



