使用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 相关文章推荐
FireFox中textNode分片的问题
Apr 10 Javascript
IE6 弹出Iframe层中的文本框“经常”无法获得输入焦点
Dec 27 Javascript
js实现的切换面板实例代码
Jun 17 Javascript
Javascript学习笔记之函数篇(四):arguments 对象
Nov 23 Javascript
javascript中return,return true,return false三者的用法及区别
Nov 17 Javascript
利用Jquery队列实现根据输入数量显示的动画
Sep 01 Javascript
Javascript this 函数深入详解
Dec 13 Javascript
从零开始学习Node.js系列教程之基于connect和express框架的多页面实现数学运算示例
Apr 13 Javascript
详解vuejs之v-for列表渲染
Jun 22 Javascript
微信小程序 sha1 实现密码加密实例详解
Jul 06 Javascript
vue.js使用v-model指令实现的数据双向绑定功能示例
May 22 Javascript
vuex的module模块用法示例
Nov 12 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
phpfans留言版用到的数据操作类和分页类
2007/01/04 PHP
PHP5.2中date()函数显示时间与北京时间相差8小时的解决办法
2009/05/28 PHP
ThinkPHP入口文件设置及相关注意事项分析
2014/12/05 PHP
php计算指定目录下文件占用空间的方法
2015/03/13 PHP
Yii2组件之多图上传插件FileInput的详细使用教程
2016/06/20 PHP
基于PHPexecl类生成复杂的报表表头示例
2016/10/14 PHP
PHP十六进制颜色随机生成器功能示例
2017/07/24 PHP
PDO::getAttribute讲解
2019/01/28 PHP
关于Laravel参数验证的一些疑与惑
2019/11/19 PHP
JavaScript高级程序设计 XML、Ajax 学习笔记
2011/09/10 Javascript
jQuery .attr()和.removeAttr()方法操作元素属性示例
2013/07/16 Javascript
高效率JavaScript编写技巧整理
2013/08/23 Javascript
jQuery异步获取json数据方法汇总
2014/12/22 Javascript
Javascript动画的实现原理浅析
2015/03/02 Javascript
jquery右下角自动弹出可关闭的广告层
2015/05/08 Javascript
javascript实现tab切换的两个实例
2015/11/05 Javascript
Bootstrap Modal遮罩弹出层(完整版)
2016/11/21 Javascript
使用Angular缓存父页面数据的方法
2017/01/03 Javascript
Django1.7+JQuery+Ajax验证用户注册集成小例子
2017/04/08 jQuery
Node之简单的前后端交互(实例讲解)
2017/11/14 Javascript
详解PHP后期静态绑定分析与应用
2018/03/21 Javascript
微信小程序使用echarts获取数据并生成折线图
2019/10/16 Javascript
如何在Vue中抽离接口配置文件
2019/10/31 Javascript
javascript实现京东快递单号的查询效果
2020/11/30 Javascript
朴素贝叶斯算法的python实现方法
2014/11/18 Python
Redis使用watch完成秒杀抢购功能的代码
2018/05/07 Python
python创建文件备份的脚本
2018/09/11 Python
python2 中 unicode 和 str 之间的转换及与python3 str 的区别
2019/07/25 Python
python 三元运算符使用解析
2019/09/16 Python
Python实现CNN的多通道输入实例
2020/01/17 Python
python如何调用php文件中的函数详解
2020/12/29 Python
前端隐藏出边界内容的实现方法
2016/04/14 HTML / CSS
大专学生推荐信范文
2013/11/19 职场文书
民主生活会对照检查材料范文
2014/10/01 职场文书
Python 线程池模块之多线程操作代码
2021/05/20 Python
SpringBoot详解执行过程
2022/07/15 Java/Android