使用Vue 自定义文件选择器组件的实例代码


Posted in Javascript onMarch 04, 2020

本文 GitHub  https://github.com/qq44924588... 上已经收录,更多往期高赞文章的分类,也整理了很多我的文档,和教程资料。欢迎Star和完善,大家面试可以参照考点复习,希望我们一起有点东西。

文件选择元素是web上最难看的 input 类型之一。它们在每个浏览器中实现的方式不同,而且通常非常难看。这里有一个解决办法,就是把它封装成一个组件。

安装

如果你尚未设置项目,可以使用 vue-cliwebpack-simple 模板启动一个新项目。

$ npm install -g vue-cli
$ vue init webpack-simple ./file-upload # Follow the prompts.
$ cd ./file-upload
$ npm install # or yarn

组件模板和样式

该组件主要做的就是将 input type=”file” 元素包装在标签中,并在其中显示其他内容,这种思路虽然简单,便却很实用。

// FileSelect.vue

<template>
 <label class="file-select">
 <div class="select-button">
  <span v-if="value">Selected File: {{value.name}}</span>
  <span v-else>Select File</span>
 </div>
 <input type="file" @change="handleFileChange"/>
 </label>
</template>

现在来加一些样式美化一下:

// FileSelect.vue
...
<style scoped>
.file-select > .select-button {
 padding: 1rem;

 color: white;
 background-color: #2EA169;

 border-radius: .3rem;

 text-align: center;
 font-weight: bold;
}

/* Don't forget to hide the original file input! */
.file-select > input[type="file"] {
 display: none;
}
</style>

封装逻辑

对于浏览器来说, file 是一种非常特殊的类型,所以有一些特殊的规则使它们有时很难处理。(更多信息请 点击这里 )。因此,我们可以借助 v-model 来封装,让该组件像普通表单元素一样。我们知道 v

我们知道, Vue 是单项数据流, v-model 只是语法糖而已,如下所示:

<input v-model="sth" />
// 上面等价于下面
<input v-bind:value="sth" v-on:input="sth = $event.target.value" />

知道了 v-model 的原理,我们来实现一下 FileSelect 组件的逻辑:

// FileSelect.vue 
<script>
export default {
 props: {
 // 这里接受一个 value 因为 v-model 会给组件传递一个 value 属性
 value: File
 },

 methods: {
 handleFileChange(e) {
  // 同样触发一个 input 来配合 v-model 的使用
  this.$emit('input', e.target.files[0])
 }
 }
}
</script>

用法

现在,我们来用下 FileSelect 组件

// App.vue
<template>
 <div>
 <p>选择文件: <file-select v-model="file"></file-select></p>
 <p v-if="file">{{file.name}}</p>
 </div>
</template>

<script>
import FileSelect from './FileSelect.vue'

export default {
 components: {
 FileSelect
 },

 data() {
 return {
  file: null
 }
 }
}
</script>

总结

虽然该事例很简单也很基础,但我们可以在这之上完善更强大的功能,在开发中,单向数据流虽然简单且易读,但在一些实际的开发中,Vue 的自定义组件,使用双向绑定也就是 v-model 的方式,会更加灵活实用,

我们需要了解及掌握这种思路,希望对大家有所帮助。

下节会在公众号发布对应的视频教程,敬请关注。

代码部署后可能存在的BUG没法实时知道,事后为了解决这些BUG,花了大量的时间进行log 调试,这边顺便给大家推荐一个好用的BUG监控工具Fundebug 。

到此这篇关于使用Vue 自定义文件选择器组件的文章就介绍到这了,更多相关vue自定义选择器内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
firefox和IE系列的相关区别整理 以备后用
Dec 28 Javascript
在IE浏览器中resize事件执行多次的解决方法
Jul 12 Javascript
js函数setTimeout延迟执行的简单介绍
Jul 17 Javascript
JQuery1.8 判断元素是否绑定事件的方法
Jul 10 Javascript
node.js中的fs.appendFileSync方法使用说明
Dec 17 Javascript
JavaScript转换二进制编码为ASCII码的方法
Apr 16 Javascript
深入浅析JavaScript中prototype和proto的关系
Nov 15 Javascript
bootstrap——bootstrapTable实现隐藏列的示例
Jan 14 Javascript
捕获未处理的Promise错误方法
Oct 13 Javascript
vue-router的HTML5 History 模式设置
Sep 08 Javascript
Vue-Cli 3.0 中配置高德地图的两种方式
Jun 19 Javascript
修改vue源码实现动态路由缓存的方法
Jan 21 Javascript
JS中==、===你分清楚了吗
Mar 04 #Javascript
js数组相减简单示例【删除a数组所有与b数组相同元素】
Mar 04 #Javascript
通过实例了解Javascript柯里化流程
Mar 03 #Javascript
微信小程序getLocation 需要在app.json中声明permission字段
Mar 03 #Javascript
Javascript作用域和作用域链原理解析
Mar 03 #Javascript
JS数组方法reduce的用法实例分析
Mar 03 #Javascript
Javascript模拟实现new原理解析
Mar 03 #Javascript
You might like
基于mysql的bbs设计(三)
2006/10/09 PHP
用php来改写404错误页让你的页面更友好
2013/01/24 PHP
linux使用crontab实现PHP执行计划定时任务
2014/05/10 PHP
完美解决thinkphp唯一索引重复时出错的问题
2017/03/31 PHP
PHP数组访问常用方法解析
2020/09/05 PHP
functional继承模式 摘自javascript:the good parts
2011/06/20 Javascript
一款Jquery 分页插件的改造方法(服务器端分页)
2011/07/11 Javascript
CSS3,HTML5和jQuery搜索框集锦
2014/12/02 Javascript
jQuery实现瀑布流布局
2014/12/12 Javascript
Javascript与jQuery方法的隐藏与显示
2015/01/19 Javascript
jQuery实现鼠标划过修改样式的方法
2015/04/14 Javascript
跟我学习javascript的var预解析与函数声明提升
2015/11/16 Javascript
jquery实现简单的banner轮播效果【实例】
2016/03/30 Javascript
基于JavaScript实现自定义滚动条
2017/01/25 Javascript
JavaScript数据结构中栈的应用之表达式求值问题详解
2017/04/11 Javascript
微信小程序云开发如何使用云函数生成二维码
2019/05/18 Javascript
angularjs模态框的使用代码实例
2019/12/20 Javascript
纯js+css实现仿移动端淘宝网站的弹出详情框功能
2019/12/29 Javascript
[01:05:59]Mineski vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.22
2019/09/05 DOTA
Python读写配置文件的方法
2015/06/03 Python
分析python切片原理和方法
2017/12/19 Python
python3+mysql查询数据并通过邮件群发excel附件
2018/02/24 Python
Python实现的多进程和多线程功能示例
2018/05/29 Python
Django配置文件代码说明
2019/12/04 Python
flask利用flask-wtf验证上传的文件的方法
2020/01/17 Python
Django框架获取form表单数据方式总结
2020/04/22 Python
基于tensorflow __init__、build 和call的使用小结
2021/02/26 Python
美国玛丽莎收藏奢华时尚商店:Marissa Collections
2016/11/21 全球购物
HelloFresh澳大利亚:订购你的美味食品盒、健康餐食
2018/03/28 全球购物
小学教师的个人自我鉴定
2013/10/24 职场文书
单位未婚证明范本
2014/01/18 职场文书
合伙协议书范本
2014/04/21 职场文书
2014年社区民政工作总结
2014/12/02 职场文书
退税申请报告怎么写
2015/05/18 职场文书
《赵州桥》教学反思
2016/02/17 职场文书
python基础之匿名函数详解
2021/04/21 Python