使用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 相关文章推荐
基于jQuery的message插件实现右下角弹出消息框
Jan 11 Javascript
jQuery学习笔记 操作jQuery对象 属性处理
Sep 19 Javascript
javascript静态页面传值的三种方法分享
Nov 12 Javascript
js实现选中复选框文字变色的方法
Aug 14 Javascript
JS实现的自定义右键菜单实例二则
Sep 01 Javascript
JavaScript实现两个select下拉框选项左移右移
Mar 09 Javascript
JScript实现地址选择功能
Aug 15 Javascript
webpack组织模块打包Library的原理及实现
Mar 10 Javascript
Node.js折腾记一:读指定文件夹,输出该文件夹的文件树详解
Apr 20 Javascript
javascript系统时间设置操作示例
Jun 17 Javascript
vue 翻页组件vue-flip-page效果
Feb 05 Javascript
js实现网页随机验证码
Oct 19 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 中的一些经验积累
2006/10/09 PHP
php实现用户在线时间统计详解
2011/10/08 PHP
PHP命名空间namespace的定义方法详解
2017/03/29 PHP
解决php 处理 form 表单提交多个 name 属性值相同的 input 标签问题
2017/05/11 PHP
Javascript 跨域访问解决方案
2009/02/14 Javascript
用户注册常用javascript代码
2009/08/29 Javascript
jQuery ajax在GBK编码下表单提交终极解决方案(非二次编码方法)
2010/10/20 Javascript
jquery异步请求实例代码
2011/06/21 Javascript
js获取class的所有元素
2013/03/28 Javascript
Linux下使用jq友好的打印JSON技巧分享
2014/11/18 Javascript
nodejs实现获取某宝商品分类
2015/05/28 NodeJs
readonly和disabled属性的区别
2015/07/26 Javascript
JavaScript中误用/g导致的正则test()无法正确重复执行的解决方案
2016/07/27 Javascript
Javascript基础回顾之(一) 类型
2017/01/31 Javascript
Vue2.0设置全局样式(less/sass和css)
2017/11/18 Javascript
关于angularJs清除浏览器缓存的方法
2017/11/28 Javascript
jquery实现企业定位式导航效果
2018/01/01 jQuery
JavaScript常用数学函数用法示例
2018/05/14 Javascript
Vue组件中的data必须是一个function的原因浅析
2018/09/03 Javascript
JavaScript对JSON数组简单排序操作示例
2019/01/31 Javascript
小程序使用watch监听数据变化的方法详解
2019/09/20 Javascript
原生JavaScript写出Tabs标签页的实例代码
2020/07/20 Javascript
vue 接口请求地址前缀本地开发和线上开发设置方式
2020/08/13 Javascript
[30:55]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第二场 11.18
2020/11/18 DOTA
从零学python系列之数据处理编程实例(二)
2014/05/22 Python
Python卸载模块的方法汇总
2016/06/07 Python
python数据清洗系列之字符串处理详解
2017/02/12 Python
python发送多人邮件没有展示收件人问题的解决方法
2019/06/21 Python
python 图像的离散傅立叶变换实例
2020/01/02 Python
python给图像加上mask,并提取mask区域实例
2020/01/19 Python
经济信息系毕业生自荐信范文
2014/03/15 职场文书
群众路线班子对照检查材料
2014/09/25 职场文书
党的群众路线教育实践活动个人对照检查材料范文
2014/09/25 职场文书
2014年为民办实事工作总结
2014/12/20 职场文书
讲座开场白台词和结束语
2015/05/29 职场文书
2016计划生育先进个人事迹材料
2016/02/29 职场文书