使用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 相关文章推荐
prototype 1.5相关知识及他人笔记
Dec 16 Javascript
使用jQuery操作Cookies的实现代码
Oct 09 Javascript
JavaScript常用全局属性与方法记录积累
Jul 03 Javascript
JS幻灯片可循环播放可平滑旋转带滚动导航(自写)
Aug 05 Javascript
jquery实现弹出窗口效果的实例代码
Nov 28 Javascript
浅析Node.js 中 Stream API 的使用
Oct 23 Javascript
SublimeText自带格式化代码功能之reindent
Dec 27 Javascript
详解javascript实现自定义事件
Jan 19 Javascript
js实现右键菜单功能
Nov 28 Javascript
微信小程序 基础组件与导航组件详细介绍
Feb 21 Javascript
微信小程序商城项目之商品属性分类(4)
Apr 17 Javascript
微信小程序日历组件使用方法详解
Dec 29 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动态创建Flash动画
2006/10/09 PHP
PHP输出控制功能在简繁体转换中的应用
2006/10/09 PHP
php中数组首字符过滤功能代码
2012/07/31 PHP
带你了解PHP7 性能翻倍的关键
2015/11/19 PHP
PHP结合Vue实现滚动底部加载效果
2017/12/17 PHP
关于Yii中模型场景的一些简单介绍
2019/09/22 PHP
jQuery 改变CSS样式基础代码
2010/02/11 Javascript
Google排名中的10个最著名的 JavaScript库
2010/04/27 Javascript
基于jquery的web页面日期格式化插件
2011/11/15 Javascript
获取元素距离浏览器周边的位置的方法getBoundingClientRect
2013/04/17 Javascript
window.print打印指定div实例代码
2013/12/13 Javascript
javascript监听鼠标滚轮事件浅析
2014/06/05 Javascript
解决jQuery uploadify在非IE核心浏览器下无法上传
2015/08/05 Javascript
jQuery电话号码验证实例
2017/01/05 Javascript
AngularJS监听ng-repeat渲染完成的两种方法
2018/01/16 Javascript
vue 路由页面之间实现用手指进行滑动的方法
2018/02/23 Javascript
详解jQuery获取特殊属性的值以及设置内容
2018/11/14 jQuery
JS模拟浏览器实现全局搜索功能
2019/09/11 Javascript
解决layer弹出层的内容页点击按钮跳转到新的页面问题
2019/09/14 Javascript
VUE实现吸底按钮
2021/03/04 Vue.js
[38:39]KG vs Mineski 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
python实现可以断点续传和并发的ftp程序
2016/09/13 Python
Python常用库推荐
2016/12/04 Python
通过Python模块filecmp 对文件比较的实现方法
2018/06/29 Python
python之文件读取一行一行的方法
2018/07/12 Python
Python单向链表和双向链表原理与用法实例详解
2018/08/31 Python
在Python中字符串、列表、元组、字典之间的相互转换
2019/11/15 Python
linux 下python多线程递归复制文件夹及文件夹中的文件
2020/01/02 Python
tensorflow之并行读入数据详解
2020/02/05 Python
Python datetime模块使用方法小结
2020/06/18 Python
单位租房协议范本
2014/12/03 职场文书
写给医生的感谢信
2015/01/22 职场文书
秋季运动会开幕词
2015/01/28 职场文书
学生个人总结范文
2015/02/15 职场文书
创业计划书之韩国烧烤店
2019/09/19 职场文书
nginx安装以及配置的详细过程记录
2021/09/15 Servers