使用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 相关文章推荐
图片按比例缩放函数
Jun 26 Javascript
Js 获取Gridview选中行的内容操作步骤
Feb 05 Javascript
JQuery 在线引用及测试引用是否成功
Jun 24 Javascript
解决JS请求服务器gbk文件乱码的问题
Oct 16 Javascript
jQuery简单实现彩色云标签效果示例
Aug 01 Javascript
jquery结合html实现中英文页面切换
Nov 29 Javascript
react性能优化达到最大化的方法 immutable.js使用的必要性
Mar 09 Javascript
jQuery插件FusionCharts绘制ScrollColumn2D图效果示例【附demo源码下载】
Mar 22 jQuery
element ui里dialog关闭后清除验证条件方法
Feb 26 Javascript
node前端开发模板引擎Jade的入门
May 11 Javascript
webpack4 SCSS提取和懒加载的示例
Sep 03 Javascript
通过js示例讲解时间复杂度与空间复杂度
Aug 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
采集邮箱的php代码(抓取网页中的邮箱地址)
2012/07/17 PHP
php网页标题中文乱码的有效解决方法
2014/03/05 PHP
作为程序员必知的16个最佳PHP库
2015/12/09 PHP
详解WordPress中创建和添加过滤器的相关PHP函数
2015/12/29 PHP
Yii2 输出xml格式数据的方法
2016/05/03 PHP
PHP 将数组打乱 shuffle函数的用法及简单实例
2016/06/17 PHP
Yii2框架实现登陆添加验证码功能示例
2018/07/12 PHP
PHP中遍历数组的三种常用方法实例分析
2019/06/24 PHP
Jquery下的26个实用小技巧(jQuery tips, tricks &amp; solutions)
2010/03/01 Javascript
Jquery css函数用法(判断标签是否拥有某属性)
2011/05/28 Javascript
jquery获取焦点和失去焦点事件代码
2013/04/21 Javascript
JS判断数组中是否有重复值得三种实用方法
2013/08/16 Javascript
JS刷新当前页面的几种方法总结
2013/12/24 Javascript
js实现刷新iframe的方法汇总
2015/04/27 Javascript
JS+CSS实现简单的二级下拉导航菜单效果
2015/09/21 Javascript
AngularJS中如何使用$parse或$eval在运行时对Scope变量赋值
2016/01/25 Javascript
jquery判断页面网址是否有效的两种方法
2016/12/11 Javascript
React教程之Props验证的具体用法(Props Validation)
2017/09/04 Javascript
你可能不知道的前端算法之文字避让(inMap)
2018/01/12 Javascript
jQuery实现表单动态添加数据并提交的方法
2018/07/19 jQuery
利用jquery和BootStrap实现动态滚动条效果
2018/12/03 jQuery
node.js ws模块搭建websocket服务端的方法示例
2019/04/25 Javascript
用Python抢过年的火车票附源码
2015/12/07 Python
python matplotlib实现双Y轴的实例
2019/02/12 Python
Python 利用高德地图api实现经纬度与地址的批量转换
2019/08/14 Python
OpenCV+Python--RGB转HSI的实现
2019/11/27 Python
python实现录屏功能(亲测好用)
2020/03/02 Python
python 异步async库的使用说明
2020/05/04 Python
mysql的最长数据库名,表名,字段名可以是多长
2014/04/21 面试题
创建索引时需要注意的事项
2013/05/13 面试题
放飞梦想演讲稿600字
2014/08/26 职场文书
2015年党员公开承诺书范文
2015/01/22 职场文书
社区六一儿童节活动总结
2015/02/11 职场文书
公司放假通知范文
2015/04/14 职场文书
考试没考好检讨书
2015/05/06 职场文书
MySQL数据库中varchar类型的数字比较大小的方法
2021/11/17 MySQL