使用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入门教程(7) History历史对象
Jan 31 Javascript
网页中的图片的处理方法与代码
Nov 26 Javascript
jQuery EasyUI API 中文文档 - Calendar日历使用
Oct 19 Javascript
jQuery .attr()和.removeAttr()方法操作元素属性示例
Jul 16 Javascript
js实现适用于素材网站的黑色多级菜单导航条效果
Aug 24 Javascript
javascript中checkbox使用方法简单实例演示
Nov 17 Javascript
RequireJS使用注意细节
May 15 Javascript
JavaScript中的this引用(推荐)
Aug 05 Javascript
js字符限制(字符截取) 一个中文汉字算两个字符
Sep 12 Javascript
深入理解Vue nextTick 机制
Apr 28 Javascript
Bootstrap实现省市区三级联动(亲测可用)
Jul 26 Javascript
vue 监听窗口变化对页面部分元素重新渲染操作
Jul 28 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
PHP代码保护--Zend Guard的使用详解
2013/06/03 PHP
thinkphp5.1 文件引入路径问题及注意事项
2018/06/13 PHP
遨游,飞飞,IE,空中网 浏览器无提示关闭方法
2011/07/11 Javascript
如何实现修改密码时密码框显示保存到cookie的密码
2013/12/10 Javascript
Javascript闭包用法实例分析
2015/01/23 Javascript
Javascript中Array用法实例分析
2015/06/13 Javascript
Highcharts 多个Y轴动态刷新数据的实现代码
2016/05/28 Javascript
JavaScript知识点总结(四)之逻辑OR运算符详解
2016/05/31 Javascript
浅谈JavaScript的内置对象和浏览器对象
2016/06/03 Javascript
第九篇Bootstrap导航菜单创建步骤详解
2016/06/21 Javascript
关于js函数解释(包括内嵌,对象等)
2016/11/20 Javascript
详解react使用react-bootstrap当轮子造车
2017/08/15 Javascript
仿ElementUI实现一个Form表单的实现代码
2019/04/23 Javascript
layui在form表单页面通过Validform加入简单验证的方法
2019/09/06 Javascript
Python的条件语句与运算符优先级详解
2015/10/13 Python
python3设计模式之简单工厂模式
2017/10/17 Python
Python中利用xpath解析HTML的方法
2018/05/14 Python
numpy判断数值类型、过滤出数值型数据的方法
2018/06/09 Python
基于Python开发chrome插件的方法分析
2018/07/07 Python
python3实现网络爬虫之BeautifulSoup使用详解
2018/12/19 Python
详解python中groupby函数通俗易懂
2020/05/14 Python
css3中单位px,em,rem,vh,vw,vmin,vmax的区别及浏览器支持情况
2016/12/06 HTML / CSS
CSS3实现自定义Checkbox特效实例代码
2017/04/24 HTML / CSS
HTML5之SVG 2D入门8—文档结构及相关元素总结
2013/01/30 HTML / CSS
无畏的旅行:Intrepid Travel
2017/12/20 全球购物
Lampegiganten丹麦:欧洲领先的照明网上商店
2018/04/25 全球购物
美国农场鲜花速递:The Bouqs
2018/07/13 全球购物
Charles & Colvard官网:美国莫桑石品牌
2019/06/05 全球购物
致跳高运动员广播稿
2014/01/13 职场文书
日化店促销方案
2014/03/26 职场文书
技术合作协议书范本
2014/04/18 职场文书
2014年小学教研工作总结
2014/12/06 职场文书
天堂的孩子观后感
2015/06/11 职场文书
婚庆答谢词大全
2015/09/29 职场文书
Python中常见的反爬机制及其破解方法总结
2021/06/10 Python
Python实战之大鱼吃小鱼游戏的实现
2022/04/01 Python