使用vue构建一个上传图片表单


Posted in Javascript onJuly 04, 2017

这篇博客也不知道起个什么名字比较好,毕竟刚开始学习vue,很多还不是很熟悉,一直在慢慢摸索中;之前也习惯了用jQuery写js代码,思维逻辑也要有个转换的过程。

1. 转变思维

使用vue编写代码,首先要做的就是转换思维,vue是一个数据驱动的框架,我们只需要操作数据,数据变化后,vue会自动改变DOM结构,而jQuery是直接操作DOM的。比如刚开始写的代码中犯的错误,有一个页面中的input标签是并列多个的,而且name属性的值是自增的,那么我就用v-for循环下,把index填充进去就行了,删除的时候根据index再进行删除。于是代码是这样的:
html:

<div id="app">
 <ul>
 <li v-for="(item, index) in username">
 ${index}. <input type="text" :name="'sb['+index+']'" /> <a href="javascript:;" :index="index" @click="del">delete</a>
 </li>
 </ul>
 <a href="javascript:;" @click="add">add</a>
</div>

js:

var app = new Vue({
 el: '#app',
 delimiters : ['${', '}'],
 data: {
  username : [1, 2, 3] // 只要数组的下标,因此数值无所谓
 },
 methods : {
 // 添加选项
 add : function(){
  this.username.push(1);
 },

 // 删除当前选项
 del : function(e){
  var index = e.target.getAttribute('index'); // 获取所在位置然后删除
  this.username.splice(index, 1);
 }
 }
})

我们先在输入框中输入不同的内容,然后删除中间的某个选项。[demo1]
结果发现,被删除的永远是最后一个。这是为什么呢,我也是删除数组了呀?我是看了官方文档后才明白:用户往输入框内输入的内容只保存在了DOM中,而我们是用vue中的username的下标渲染的出来的DOM元素,我们并没有保存用户输入的内容。当我们删除了其中的某一项时,username发生变化,导致DOM重新渲染,渲染后,最后一项就没有了。
那么怎么修改才能真正的实现删除某一项呢?我们只需要把用户输入的内容保存到username数组中即可:

html:

<div id="app">
 <ul>
 <li v-for="(item, index) in username">
 ${index}. <input type="text" :name="'sb['+index+']'" :value="item" > <a href="javascript:;" :index="index" @click="del">delete</a>
 </li>
 </ul>
 <a href="javascript:;" @click="add">add</a>
</div>

js:

var app = new Vue({
 el: '#app',
 delimiters : ['${', '}'],
 data: {
  username : ['wenzi', 'xxxx', 'yyyy'] // 只要数组的下标,因此数值无所谓
 },
 methods : {
 // 添加选项
 add : function(){
  this.username.push(''); // 新添加的输入框为空
 },

 // 删除当前选项
 del : function(e){
  var index = e.target.getAttribute('index'); // 获取所在位置然后删除
  this.username.splice(index, 1);
 }
 }
})

再来看下效果:[demo2]

2. 上传图片

刚开始时,使用的jQuery的插件fileupload,功能很全,当我为file标签绑定上change事件后,然后再调用该插件进行图片上传,总是会出现意想不到的bug,比如我先对图片格式进行限制,只能上传png格式的图片,可是有时候jpg格式的也能上传上去;png格式的图片,英文名称无法上传,先传个中文名称,然后就可以再上传英文呢名称的了。
后来发现html5下的formData属性,能非常方便的上传图片,而且同时还能上传其他的参数,一小段代码即可搞定:

// 上传图片,绑定change事件
uppic : function(e){
 var file = e.target.files[0]; // 每次只允许上传一张图片,因此只取[0]

 // 判断图片格式
 if( file.type!='image/png' ){ 
  alert('图片格式不正确');
  e.target.files.length = 0;
  $(e.target).val('');
  return false; 
 }

 // 使用formData组装数据
 var formData = new FormData();
 formData.append('pic', $(e.target)[0].files[0]); // 文件数据
 formData.append('flag', '1'); // 其他的一些参数
 $.ajax({// ajax上传
  url: 'xxxxx.php',
  type: 'POST',
  cache: false,
  data: formData,
  processData: false,
  contentType: false
 }).done(function(result) {
  console.log('上传完成');
 });
}

3. 总结

现在也是刚开始学习vue,代码肯定比较烂,最重要的还是转变思维吧!

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

Javascript 相关文章推荐
javascript实现日历控件(年月日关闭按钮)
Dec 12 Javascript
js获取RadioButtonList的Value/Text及选中值等信息实现代码
Mar 05 Javascript
JS保存和删除cookie操作 判断cookie是否存在
Nov 13 Javascript
用jQuery模拟select下拉框的简单示例代码
Jan 26 Javascript
详谈jQuery操纵DOM元素属性 attr()和removeAtrr()方法
Jan 22 Javascript
jQuery实现鼠标悬停背景翻转的黑色导航菜单代码
Sep 14 Javascript
微信小程序 定义全局数据、函数复用、模版等详细介绍
Oct 27 Javascript
bootstrap提示标签、提示框实现代码
Dec 28 Javascript
妙用缓存调用链实现JS方法的重载
Apr 30 Javascript
javascript触发模拟鼠标点击事件
Jun 26 Javascript
Egg Vue SSR 服务端渲染数据请求与asyncData
Nov 24 Javascript
简单聊聊TypeScript只读修饰符
Apr 06 Javascript
vue-resource 拦截器(interceptor)的使用详解
Jul 04 #Javascript
JavaScript在控件上添加倒计时功能的实现代码
Jul 04 #Javascript
JavaScript异步上传图片文件的实例代码
Jul 04 #Javascript
详解vue-router和vue-cli以及组件之间的传值
Jul 04 #Javascript
详解Angular.js中$http拦截器的介绍及使用
Jul 04 #Javascript
详解vue-cli 脚手架项目-package.json
Jul 04 #Javascript
Angular 2父子组件数据传递之@ViewChild获取子组件详解
Jul 04 #Javascript
You might like
山进SANGEAN ATS-909X电路分析
2021/03/02 无线电
PHP - Html Transfer Code
2006/10/09 PHP
rrmdir php中递归删除目录及目录下的文件
2011/05/15 PHP
PHP模块 Memcached功能多于Memcache
2011/06/14 PHP
php对图像的各种处理函数代码小结
2013/07/08 PHP
php面试实现反射注入的详细方法
2019/09/30 PHP
Javascript 代码也可以变得优美的实现方法
2009/06/22 Javascript
Prototype 学习 工具函数学习($方法)
2009/07/12 Javascript
用JQuery 判断某个属性是否存在hasAttr的解决方法
2013/04/26 Javascript
详解JavaScript ES6中的Generator
2015/07/28 Javascript
封装获取dom元素的简单实例
2016/07/08 Javascript
jQuery双向列表选择器select版
2016/11/01 Javascript
基于JavaScript实现Tab选项卡切换效果
2016/11/24 Javascript
完美解决input[type=number]无法显示非数字字符的问题
2017/02/28 Javascript
JS点击动态添加标签、删除指定标签的代码
2018/04/18 Javascript
swiper在vue项目中loop循环轮播失效的解决方法
2018/09/15 Javascript
理理Vue细节(推荐)
2019/04/16 Javascript
探索JavaScript中私有成员的相关知识
2019/06/13 Javascript
[00:27]DOTA2荣耀之路2:Patience from zhou!
2018/05/24 DOTA
python多重继承实例
2014/10/11 Python
Python中矩阵库Numpy基本操作详解
2017/11/21 Python
python opencv人脸检测提取及保存方法
2018/08/03 Python
Python一句代码实现找出所有水仙花数的方法
2018/11/13 Python
Django基础知识 URL路由系统详解
2019/07/18 Python
python模式 工厂模式原理及实例详解
2020/02/11 Python
tensorflow保持每次训练结果一致的简单实现
2020/02/17 Python
Python如何实现爬取B站视频
2020/05/20 Python
Python StringIO及BytesIO包使用方法解析
2020/06/15 Python
HTML5+CSS3模仿优酷视频截图功能示例
2017/01/05 HTML / CSS
美国生鲜及杂货电商:FreshDirect
2018/01/29 全球购物
人资专员岗位职责
2014/04/04 职场文书
品酒会策划方案
2014/05/26 职场文书
工程款申请报告
2015/05/15 职场文书
教育读书笔记
2015/07/02 职场文书
小学生纪律委员竞选稿
2015/11/19 职场文书
Python自动化工具之实现Excel转Markdown表格
2022/04/08 Python