使用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 相关文章推荐
Jquery.addClass始终无效原因分析
Sep 08 Javascript
Javascript 遍历页面text控件详解
Jan 06 Javascript
jQuery过滤HTML标签并高亮显示关键字的方法
Aug 07 Javascript
无需 Flash 使用 jQuery 复制文字到剪贴板
Apr 26 Javascript
拥Bootstrap入怀——导航栏篇
May 30 Javascript
JS 实现Base64编码与解码实例详解
Nov 07 Javascript
如何使用JS在HTML中自定义字符串格式化
Jul 20 Javascript
教你5分钟学会用requirejs(必看篇)
Jul 25 Javascript
Javascript中this关键字指向问题的测试与详解
Aug 11 Javascript
用JavaScript做简易的购物车的代码示例
Oct 20 Javascript
vue.js将时间戳转化为日期格式的实现代码
Jun 05 Javascript
微信小程序调用wx.getImageInfo遇到的坑解决
May 31 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中上传大体积文件时需要的设置
2006/10/09 PHP
PHP ? EasyUI DataGrid 资料取的方式介绍
2012/11/07 PHP
PHP echo()函数讲解
2019/02/15 PHP
jQuery技巧总结
2011/01/01 Javascript
JQuery查找DOM节点的方法
2015/06/11 Javascript
js实现仿爱微网两级导航菜单效果代码
2015/08/31 Javascript
jquery.Callbacks的实现详解
2016/11/30 Javascript
详解js中常规日期格式处理、月历渲染和倒计时函数
2016/12/28 Javascript
jquery easyui DataGrid简单示例
2017/01/23 Javascript
JS作用域链详解
2017/06/26 Javascript
JavaScript学习笔记之惰性函数示例详解
2017/08/27 Javascript
vue项目中使用lib-flexible解决移动端适配的问题解决
2018/08/23 Javascript
详解利用nodejs对本地json文件进行增删改查
2019/09/20 NodeJs
简单谈谈offsetleft、offsetTop和offsetParent
2020/12/04 Javascript
[26:24]完美副总裁、DOTA2负责人蔡玮专访:电竞如人生
2014/09/11 DOTA
[02:56]《DAC最前线》之国外战队抵达上海备战亚洲邀请赛
2015/01/28 DOTA
机器学习10大经典算法详解
2017/12/07 Python
Python类装饰器实现方法详解
2018/12/21 Python
Pyqt5 基本界面组件之inputDialog的使用
2019/06/25 Python
python numpy 常用随机数的产生方法的实现
2019/08/21 Python
在python shell中运行python文件的实现
2019/12/21 Python
pytorch GAN伪造手写体mnist数据集方式
2020/01/10 Python
flask框架渲染Jinja模板与传入模板变量操作详解
2020/01/25 Python
Python 通过监听端口实现唯一脚本运行方式
2020/05/05 Python
Matplotlib配色之Colormap详解
2021/01/05 Python
matplotlib部件之套索Lasso的使用
2021/02/24 Python
python SOCKET编程基础入门
2021/02/27 Python
ziaja齐叶雅官方海外旗舰店:来自波兰的天然护肤品牌
2017/01/02 全球购物
个人安全生产责任书
2014/07/28 职场文书
共产党员批评与自我批评
2014/10/15 职场文书
政风行风评议心得体会
2014/10/21 职场文书
大学生简历自我评价2015
2015/03/03 职场文书
项目经理助理岗位职责
2015/04/13 职场文书
学生检讨书范文
2019/06/24 职场文书
仅用一句SQL更新整张表的涨跌幅、涨跌率的解决方案
2021/05/06 MySQL
win11无法登录onedrive错误代码0x8004def7怎么办 ?
2022/04/05 数码科技