使用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判断用户浏览器插件安装情况的代码
Jan 01 Javascript
js实现动态添加、删除行、onkeyup表格求和示例
Aug 18 Javascript
Egret引擎开发指南之创建项目
Sep 03 Javascript
JavaScript中textRange对象使用方法小结
Mar 24 Javascript
深入理解JavaScript编程中的同步与异步机制
Jun 24 Javascript
jQuery实现表格奇偶行显示不同背景色 就这么简单
Mar 13 Javascript
基于AGS JS开发自定义贴图图层
Mar 31 Javascript
原生JS+HTML5实现跟随鼠标一起流动的粒子动画效果
May 03 Javascript
jquery简单实现纵向的无缝滚动代码实例
Apr 01 jQuery
借助云开发实现小程序短信验证码的发送
Jan 06 Javascript
JS 5种遍历对象的方式
Jun 16 Javascript
js实现删除json中指定的元素
Sep 22 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
php通用防注入程序 推荐
2011/02/26 PHP
PHP 图片水印类代码
2012/08/27 PHP
值得分享的php+ajax实时聊天室
2016/07/20 PHP
PHP生成随机数的方法总结
2018/03/01 PHP
自动更新作用
2006/10/08 Javascript
javascript jQuery $.post $.ajax用法
2008/07/09 Javascript
jquery操作checkbox实现全选和取消全选
2014/05/02 Javascript
JavaScript事件委托用法分析
2015/01/24 Javascript
简介JavaScript中setUTCSeconds()方法的使用
2015/06/12 Javascript
jquery制作图片时钟特效
2020/03/30 Javascript
js获取Html元素的实际宽度高度的方法
2016/05/19 Javascript
浅谈js中StringBuffer类的实现方法及使用
2016/09/02 Javascript
基于Vue实例对象的数据选项
2017/08/09 Javascript
基于Vue实现拖拽功能
2020/07/29 Javascript
微信小程序开发之改变data中数组或对象的某一属性值
2018/07/05 Javascript
NodeJS http模块用法示例【创建web服务器/客户端】
2019/11/05 NodeJs
Vue proxyTable配置多个接口地址,解决跨域的问题
2020/09/11 Javascript
[52:02]DOTA2-DPC中国联赛 正赛 Phoenix vs Dragon BO3 第二场 2月26日
2021/03/11 DOTA
11月编程语言排行榜 Python逆袭C#上升到第4
2017/11/15 Python
用python实现对比两张图片的不同
2018/02/05 Python
python脚本当作Linux中的服务启动实现方法
2019/06/28 Python
python读出当前时间精度到秒的代码
2019/07/05 Python
Pytorch GPU显存充足却显示out of memory的解决方式
2020/01/13 Python
基于python实现查询ip地址来源
2020/06/02 Python
keras分类之二分类实例(Cat and dog)
2020/07/09 Python
购买一个高级域名:BuyDomains
2018/03/11 全球购物
人力资源专员自我评价怎么写
2013/09/19 职场文书
中专药剂专业应届毕的自我评价
2013/12/27 职场文书
中学清明节活动总结
2014/07/04 职场文书
安全例会汇报材料
2014/08/23 职场文书
九九重阳节标语
2014/10/07 职场文书
科技活动周标语
2014/10/08 职场文书
资料员岗位职责
2015/02/10 职场文书
教师教育教学随笔
2015/08/15 职场文书
酒店工程部的岗位职责汇总大全
2019/10/23 职场文书
Java图书管理系统,课程设计必用(源码+文档)
2021/06/30 Java/Android