使用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 相关文章推荐
Javascript 个人笔记(没有整理,很乱)
Jul 07 Javascript
jQuery焦点图切换简易插件制作过程全纪录
Aug 27 Javascript
JS hashMap实例详解
May 26 Javascript
分享jQuery封装好的一些常用操作
Jul 28 Javascript
通过bootstrap全面学习less
Nov 09 Javascript
Vue计算属性的学习笔记
Mar 22 Javascript
node.js 核心http模块,起一个服务器,返回一个页面的实例
Sep 11 Javascript
vue 组件的封装之基于axios的ajax请求方法
Aug 11 Javascript
Vue中mintui的field实现blur和focus事件的方法
Aug 25 Javascript
js自定义input文件上传样式
Oct 26 Javascript
微信小程序实现简易table表格
Jun 19 Javascript
如何使用JavaScript策略模式校验表单
Apr 29 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
dedecms后台验证码总提示错误的解决方法
2007/03/21 PHP
PHP中读取照片exif信息的方法
2014/08/20 PHP
php将字符串随机分割成不同长度数组的方法
2015/06/01 PHP
10款PHP开源商城系统汇总介绍
2015/07/23 PHP
PHP可变变量学习小结
2015/11/29 PHP
PHP进阶学习之命名空间基本用法分析
2019/06/18 PHP
让页面上两个div中的滚动条(滑块)同步运动示例
2013/08/07 Javascript
JS的事件绑定深入认识
2014/06/26 Javascript
JavaScript实现向setTimeout执行代码传递参数的方法
2015/04/16 Javascript
jquery插件splitScren实现页面分屏切换模板特效
2015/06/16 Javascript
详解JavaScript中数组和字符串的lastIndexOf()方法使用
2016/03/13 Javascript
基于JS如何实现类似QQ好友头像hover时显示资料卡的效果(推荐)
2016/06/09 Javascript
JavaScript 冒泡排序和选择排序的实现代码
2016/09/03 Javascript
微信小程序使用第三方库Underscore.js步骤详解
2016/09/27 Javascript
前端js实现文件的断点续传 后端PHP文件接收
2016/10/14 Javascript
如何使用CSS3+JQuery实现悬浮墙式菜单
2019/06/18 jQuery
小程序跨页面交互的作用与方法详解
2020/01/07 Javascript
基于Web Audio API实现音频可视化效果
2020/06/12 Javascript
vue使用echarts实现水平柱形图实例
2020/09/09 Javascript
解决Vue keep-alive 调用 $destory() 页面不再被缓存的情况
2020/10/30 Javascript
[02:15]你好,这就是DOTA!
2015/08/05 DOTA
python列表操作之extend和append的区别实例分析
2015/07/28 Python
详解Python中dict与set的使用
2015/08/10 Python
深入浅析python中的多进程、多线程、协程
2016/06/22 Python
利用PyInstaller将python程序.py转为.exe的方法详解
2017/05/03 Python
python利用wx实现界面按钮和按钮监听和字体改变的方法
2019/07/17 Python
python-docx文件定位读取过程(尝试替换)
2020/02/13 Python
Python unittest基本使用方法代码实例
2020/06/29 Python
Python json解析库jsonpath原理及使用示例
2020/11/25 Python
在pycharm中使用pipenv创建虚拟环境和安装django的详细教程
2020/11/30 Python
工商管理专业实习大学生自我鉴定
2013/09/19 职场文书
秋季红领巾广播稿
2014/01/27 职场文书
国际贸易毕业生求职信范文
2014/02/21 职场文书
《池塘边的叫声》教学反思
2014/04/12 职场文书
商务专员岗位职责范本
2014/06/29 职场文书
公司感恩节活动策划书
2014/10/11 职场文书