使用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 ReferenceError: $ is not defined 错误的处理办法
May 10 Javascript
JQuery调用WebServices的方法和4个实例
May 06 Javascript
JavaScript中的事件委托及好处
Jul 12 Javascript
js简单获取表单中单选按钮值的方法
Aug 23 Javascript
jQuery实现磁力图片跟随效果完整示例
Sep 16 Javascript
分分钟学会vue中vuex的应用(入门教程)
Sep 14 Javascript
JS实现的JSON数组去重算法示例
Apr 11 Javascript
如何更好的编写js async函数
May 13 Javascript
抖音上用记事本编写爱心小程序教程
Apr 17 Javascript
js判断复选框是否选中的方法示例【基于jQuery】
Oct 10 jQuery
详解搭建一个vue-cli的移动端H5开发模板
Jan 17 Javascript
JS如何生成动态列表
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
德生PL660的电路分析和打磨
2021/03/02 无线电
深入解析Session是否必须依赖Cookie
2013/08/02 PHP
php中输出json对象的值(实现方法)
2018/03/07 PHP
javascript nextSibling 与 getNextElement(node) 使用介绍
2011/10/13 Javascript
上传的js验证(图片/文件的扩展名)
2013/04/25 Javascript
JavaScript跨浏览器获取页面中相同class节点的方法
2015/03/03 Javascript
pace.js页面加载进度条插件
2015/09/29 Javascript
基于js实现二级下拉联动
2016/12/17 Javascript
JS ES6中setTimeout函数的执行上下文示例
2017/04/27 Javascript
浅谈React Native Flexbox布局(小结)
2018/01/08 Javascript
mint-ui 时间插件使用及获取选择值的方法
2018/02/09 Javascript
Vue数据绑定实例写法
2019/08/06 Javascript
Vue实现商品详情页的评价列表功能
2019/09/04 Javascript
微信小程序实现页面左右滑动
2020/11/16 Javascript
全面解析Vue中的$nextTick
2020/12/24 Vue.js
[42:32]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第二场 11.27
2020/12/01 DOTA
Python连接mssql数据库编码问题解决方法
2015/01/01 Python
Python cookbook(数据结构与算法)对切片命名清除索引的方法
2018/03/13 Python
TensorFlow实现简单卷积神经网络
2018/05/24 Python
对numpy中shape的深入理解
2018/06/15 Python
如何使用Python进行OCR识别图片中的文字
2019/04/01 Python
详解python播放音频的三种方法
2019/09/23 Python
关于numpy数组轴的使用详解
2019/12/05 Python
Python集合操作方法详解
2020/02/09 Python
matlab灰度图像调整及imadjust函数的用法详解
2020/02/27 Python
纯css3实现宠物小鸡实例代码
2018/10/08 HTML / CSS
美国女性服饰销售网站:Nasty Gal(坏女孩)
2016/07/26 全球购物
ghd澳大利亚官方网站:英国最受欢迎的美发工具品牌
2018/05/21 全球购物
新学期家长寄语
2014/01/19 职场文书
旅游管理毕业生自荐信范文
2014/03/19 职场文书
保险公司增员口号
2015/12/25 职场文书
2016国庆促销广告语
2016/01/28 职场文书
nginx网站服务如何配置防盗链(推荐)
2021/03/31 Servers
Vue实现动态查询规则生成组件
2021/05/27 Vue.js
解决SpringBoot文件上传临时目录找不到的问题
2021/07/01 Java/Android
《王者天下》第4季首话新剧照 4月9日正式开播
2022/04/07 日漫