使用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 相关文章推荐
图片自动更新(说明)
Oct 02 Javascript
JavaScript基本对象
Jan 11 Javascript
一行代码告别document.getElementById
Jun 01 Javascript
extjs 时间范围选择自动判断的实现代码
Jun 24 Javascript
PHP+jQuery+Ajax+Mysql如何实现发表心情功能
Aug 06 Javascript
javascript合并表格单元格实例代码
Jan 03 Javascript
实例浅析js的this
Dec 11 Javascript
js遍历json的key和value的实例
Jan 22 Javascript
vue 计时器组件的实现代码
Sep 14 Javascript
对vux点击事件的优化详解
Aug 28 Javascript
js实现图片放大并跟随鼠标移动特效
Jan 18 Javascript
JsonServer安装及启动过程图解
Feb 28 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
mysql_fetch_assoc和mysql_fetch_row的功能加起来就是mysql_fetch_array
2007/01/15 PHP
php中的一些数组排序方法分享
2012/07/20 PHP
PHP后期静态绑定之self::限制实例分析
2018/12/21 PHP
用JAVASCRIPT如何给&amp;lt;textarea&amp;gt;&amp;lt;/textarea&amp;gt;赋值
2007/04/20 Javascript
jquery checkbox实现单选小例
2013/11/27 Javascript
jQuery select表单提交省市区城市三级联动核心代码
2014/06/09 Javascript
Node.js中调用mysql存储过程示例
2014/12/20 Javascript
js控制div层的叠加简单方法
2016/10/15 Javascript
vue.js 中使用(...)运算符报错的解决方法
2018/08/09 Javascript
JavaScript实现汉字转换为拼音及缩写的方法示例
2019/03/28 Javascript
在Vue项目中用fullcalendar制作日程表的示例代码
2019/08/04 Javascript
javascript递归函数定义和用法示例分析
2020/07/22 Javascript
python有证书的加密解密实现方法
2014/11/19 Python
Python程序员面试题 你必须提前准备!(答案及解析)
2018/01/23 Python
Django项目中使用JWT的实现代码
2019/11/04 Python
python对验证码降噪的实现示例代码
2019/11/12 Python
用python解压分析jar包实例
2020/01/16 Python
详解用Python进行时间序列预测的7种方法
2020/03/13 Python
pytorch快速搭建神经网络_Sequential操作
2020/06/17 Python
python3中celery异步框架简单使用+守护进程方式启动
2021/01/20 Python
纯CSS实现的大小渐变、渐远效果
2014/04/15 HTML / CSS
CSS3毛玻璃效果(blur)有白边问题的解决方法
2016/11/15 HTML / CSS
浅析border-radius如何兼容IE
2016/04/19 HTML / CSS
英国领先的酒类网上商城:TheDrinkShop
2017/03/16 全球购物
英国最大的老式糖果店:A Quarter Of
2017/04/08 全球购物
香港交友网站:be2香港
2018/07/22 全球购物
请说出以下代码输出什么
2013/08/30 面试题
仓库管理制度
2014/01/21 职场文书
优秀团员个人事迹材料
2014/01/29 职场文书
3分钟演讲稿
2014/04/30 职场文书
学习保证书范文
2014/04/30 职场文书
岗位职责说明书
2014/05/07 职场文书
处级干部反四风个人对照检查材料思想汇报
2014/09/27 职场文书
个人委托书范本汇总
2014/10/01 职场文书