使用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更改class和id的方法
Oct 10 Javascript
基于jQuery的获取标签名的代码
Jul 16 Javascript
自己写的Javascript计算时间差函数
Oct 28 Javascript
jquery禁止输入数字以外的字符的示例(纯数字验证码)
Apr 10 Javascript
javascript模拟post提交隐藏地址栏的参数
Sep 03 Javascript
JavaScript汉诺塔问题解决方法
Apr 21 Javascript
Bootstrap基本组件学习笔记之导航(10)
Dec 07 Javascript
bootstrap配合Masonry插件实现瀑布式布局
Jan 18 Javascript
jquery replace方法去空格
May 08 jQuery
vue-router的hooks用法详解
Jun 08 Javascript
vue中父子组件传值,解决钩子函数mounted只运行一次的操作
Jul 27 Javascript
Vue中computed及watch区别实例解析
Aug 01 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中利用wsdl创建标准webservice的实现代码
2011/12/07 PHP
PHP内核探索:变量存储与类型使用说明
2014/01/30 PHP
php自动识别文件编码并转换为UTF-8的方法
2014/06/12 PHP
PHP中is_file()函数使用指南
2015/05/08 PHP
PHP 反射(Reflection)使用实例
2015/05/12 PHP
js截取字符串的两种方法及区别详解
2013/11/05 Javascript
php跨域调用json的例子
2013/11/13 Javascript
兼容主流浏览器的iframe自适应高度js脚本
2014/01/10 Javascript
jQuery支持添加事件的日历特效代码分享(3种样式)
2015/08/24 Javascript
JQuery实现左右滚动菜单特效
2015/09/28 Javascript
浅析JSONP技术原理及实现
2016/06/08 Javascript
微信小程序模板之分页滑动栏
2017/02/10 Javascript
vue+webpack实现异步加载三种用法示例详解
2018/04/24 Javascript
基于打包工具Webpack进行项目开发实例
2018/05/29 Javascript
vue-router 源码之实现一个简单的 vue-router
2018/07/02 Javascript
Vue2.0点击切换类名改变样式的方法
2018/08/22 Javascript
微信小程序学习笔记之跳转页面、传递参数获得数据操作图文详解
2019/03/28 Javascript
记一次vue跨域的解决
2020/10/21 Javascript
py中的目录与文件判别代码
2008/07/16 Python
详解Python的Django框架中的Cookie相关处理
2015/07/22 Python
Python 爬虫爬取指定博客的所有文章
2016/02/17 Python
机器学习python实战之决策树
2017/11/01 Python
python 多维切片之冒号和三个点的用法介绍
2018/04/19 Python
python自动从arxiv下载paper的示例代码
2020/12/05 Python
家得宝加拿大家装网上商店:The Home Depot加拿大
2016/08/27 全球购物
美国演唱会订票网站:Ticketmaster美国
2017/10/05 全球购物
应届生英语教师求职信
2013/11/05 职场文书
超市业务员岗位职责
2013/12/05 职场文书
毕业生就业自荐书
2013/12/15 职场文书
师德演讲稿范文
2014/05/06 职场文书
群众路线个人自我剖析材料
2014/10/07 职场文书
高中教师个人工作总结
2015/02/10 职场文书
民间借贷借条范本
2015/05/25 职场文书
创业计划书介绍
2019/04/24 职场文书
HTML+JS实现在线朗读器
2022/02/15 Javascript
python中validators库的使用方法详解
2022/09/23 Python