使用FileReader API创建Vue文件阅读器组件


Posted in Javascript onApril 03, 2018

有时候我们需要从文件中读取数据。在以前,你需要将其发送到服务器,然后返回所需的数据。问题是,现在我们还可以使用 FileReader API 直接访问浏览器中的文件。

如果我们只是想读取一个文本文件,以便在UI级别上做一些无关紧要的事情,那么就不需要将文件发送到服务器。下面的示例将实现从一个文件中读取相关的数据填充到一个 textarea 中。

FileReader API

FileReader API提供了一个很好的接口,可以使用文本或Blob对象类型以不同的方式读取数据。

FileReader 实例有一个 readAsText 方法,我们可以使用它来读取文件作为文本:

const reader = new FileReader();
reader.readAsText(file);

由于FileReader API是异步的,因此它公开了一些我们可以用来获得它的状态的事件。特别是,当读取文件时,我们需要 onload 事件来访问数据:

const reader = new FileReader();
reader.onload = e => console.log(e.target.result);
reader.readAsText(file);

正如你所看到的,文本数据可以通过 e.target.result 来访问。

到目前为止,浏览器对其支持情况如下:

使用FileReader API创建Vue文件阅读器组件

文件阅读器组件

前面的代码已经读取了一个文件,但是我们仍然要给它一个 file 对象。为此,我们必需使用 <input type="file"> 的HTML标记,这将触发一个 change 事件,然后通过 e.target.files 访问该文件。

让我们创建一个 FileReader 组件,将其组合在一起:

<template id="fileReader">
 <label class="text-reader">
  <input type="file" @change="loadTextFromFile" />
 </label>
</template>

Vue.component('file-reader',{
 template: '#fileReader',
 methods: {
  loadTextFromFile: function (e) {
   const file = e.target.files[0]
   const reader = new FileReader()

   reader.onload = e => this.$emit('load', e.target.result)
   reader.readAsText(file)
  }
 }
})

组件监听 load 事件,以便父组件能够处理数据。

使用组件

把新创建的 file-reader 组件挂载到 #app 的 div 元素下,来演示我们的组件:

<div id="app">
 <textarea rows="10" v-model="text"></textarea>
 <file-reader @load="text = $event"></file-reader>
</div>

let app = new Vue({
 el: '#app',
 data () {
  return {
   text: ''
  }
 }
})

我们需要在 data 中添加一个 text 属性,并使用 v-model 将其绑定到 textarea 上。最后,我们将捕获 @load 事件,并通过 $event 将 text 属性设置为有效的加载事件。

这个时候你看到的效果如下:

使用FileReader API创建Vue文件阅读器组件

其实到现在,功能已经有了,在你的浏览器像下图这样操作,你就可以看到效果了:

使用FileReader API创建Vue文件阅读器组件

特别提醒:我尝试了几种文件格式,对于图片、PDF等文件格式加载会乱码,但加载 .md 或者 .doc 之类的文件,对应的内容能正常的显示在 textarea 中。

添加样式

如果你阅读到这里的话,你应该看到了效果。长得很丑(事实上没有任何的样式效果)。接下来添加一些样式,让其看起来好看一些。

在每个浏览器中, <input type="file"> 的渲染效果是不一样的。如果我们想要一个相同的渲染效果,就需要有一个自定义的样式。那么可以将 input 隐藏,并使用 <label> 替代他。

要隐藏 input ,可以使用 opacity:0 或使用 display:block , visibility:hidden 让其具有可访问性。我们还需要使用 position 和 z-index 两属性,以便把它放在 label 后面:

<template id="fileReader">
 <label class="file-reader">
  Read File
  <input type="file" @change="loadTextFromFile" />
 </label>
</template>

.file-reader {
 position: relative;
 overflow: hidden;
 display: inline-block;
 border: 2px solid black;
 border-radius: 5px;
 padding: 8px 12px;
 cursor: pointer;

 input {
  position: absolute;
  top: 0;
  left: 0;
  z-index: -1;
  opacity: 0;
 }
}

当然,为了好看一些,你还可以给其他元素添加一些样式。最终你看到的效果如下:

使用FileReader API创建Vue文件阅读器组件

Javascript 相关文章推荐
js实现进度条的方法
Feb 13 Javascript
jQuery判断元素上是否绑定了指定事件的方法
Mar 17 Javascript
js如何实现淡入淡出效果
Nov 18 Javascript
javascript 将共享属性迁移到原型中去的实现方法
Aug 31 Javascript
JQuery控制DIV的选取实现方法
Sep 18 Javascript
微信小程序 视图层(xx.xml)和逻辑层(xx.js)详细介绍
Oct 13 Javascript
微信小程序本地缓存数据增删改查实例详解
May 24 Javascript
JavaScript实现三级联动菜单效果
Aug 16 Javascript
javaScript动态添加Li元素的实例
Feb 24 Javascript
JS实现的全选、全不选及反选功能【案例】
Feb 19 Javascript
Vue proxyTable配置多个接口地址,解决跨域的问题
Sep 11 Javascript
交互式可视化js库gojs使用介绍及技巧
Feb 18 Javascript
vue内置指令详解
Apr 03 #Javascript
详解在React里使用&quot;Vuex&quot;
Apr 02 #Javascript
Angular2进阶之如何避免Dom误区
Apr 02 #Javascript
Vue项目分环境打包的实现步骤
Apr 02 #Javascript
详解webpack-dev-server的简单使用
Apr 02 #Javascript
webpack v4 从dev到prd的方法
Apr 02 #Javascript
vue axios登录请求拦截器
Apr 02 #Javascript
You might like
php生成随机密码的三种方法小结
2010/09/04 PHP
PHP学习笔记之三 数据库基本操作
2011/01/17 PHP
两个select之间option的互相添加操作(jquery实现)
2009/11/12 Javascript
50款非常棒的 jQuery 插件分享
2012/03/29 Javascript
js图片延迟技术一般的思路与示例
2014/03/20 Javascript
让alert不出现弹窗的两种方法
2014/05/18 Javascript
jquery trigger伪造a标签的click事件取代window.open方法
2014/06/23 Javascript
jQuery中:file选择器用法实例
2015/01/04 Javascript
jQuery中:checked选择器用法实例
2015/01/04 Javascript
js由下向上不断上升冒气泡效果实例
2015/05/07 Javascript
AngularJS中的Directive自定义一个表格
2016/01/25 Javascript
js中获取时间new Date()的全面介绍
2016/06/20 Javascript
仿Angular Bootstrap TimePicker创建分钟数-秒数的输入控件
2016/07/01 Javascript
jQuery通用的全局遍历方法$.each()用法实例
2016/07/04 Javascript
RequireJS简易绘图程序开发
2016/10/28 Javascript
js实现百度搜索提示框
2017/02/05 Javascript
jquery根据name取得select选中的值实例(超简单)
2018/01/25 jQuery
Vue.js组件间通信方式总结【推荐】
2018/11/23 Javascript
Python黑魔法@property装饰器的使用技巧解析
2016/06/16 Python
python爬虫使用cookie登录详解
2017/12/27 Python
用Python写一段用户登录的程序代码
2018/04/22 Python
python3实现163邮箱SMTP发送邮件
2018/05/22 Python
Python数据报表之Excel操作模块用法分析
2019/03/11 Python
python读写Excel表格的实例代码(简单实用)
2019/12/19 Python
Python configparser模块操作代码实例
2020/06/08 Python
Rockport乐步美国官网:风靡美国的白宫鞋
2016/11/24 全球购物
Mamas & Papas沙特阿拉伯:英国最受欢迎的婴儿品牌
2017/11/20 全球购物
潘多拉珠宝美国官方网站:Pandora US
2020/06/18 全球购物
教师个人的自我评价分享
2014/01/02 职场文书
cf搞笑广告词
2014/03/14 职场文书
小学生节约用水倡议书
2014/05/15 职场文书
知识竞赛拉拉队口号
2014/06/16 职场文书
男性健康日的活动方案
2014/08/18 职场文书
2015迎新晚会开场白
2015/05/29 职场文书
学生会副主席竞选稿
2015/11/19 职场文书
mysql如何能有效防止删库跑路
2021/10/05 MySQL