使用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 相关文章推荐
浅析JavaScript中的隐式类型转换
Dec 05 Javascript
禁止页面刷新让F5快捷键及右键都无效
Jan 22 Javascript
node.js中的fs.fsyncSync方法使用说明
Dec 15 Javascript
JavaScript中setFullYear()方法的使用详解
Jun 11 Javascript
jQuery基于toggle实现click触发DIV的显示与隐藏问题分析
Jun 12 Javascript
js接收并转化Java中的数组对象的方法
Aug 11 Javascript
完美解决input[type=number]无法显示非数字字符的问题
Feb 28 Javascript
JS中使用 after 伪类清除浮动实例
Mar 01 Javascript
简单谈谈js的数据类型
Sep 25 Javascript
利用JS hash制作单页Web应用的方法详解
Oct 10 Javascript
详解JavaScript实现动态的轮播图效果
Apr 29 Javascript
微信小程序绑定手机号获取验证码功能
Oct 22 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中$_FILES的使用以及注意事项
2013/07/05 PHP
php分页代码学习示例分享
2014/02/20 PHP
php获取服务器端mac和客户端mac的地址支持WIN/LINUX
2014/05/15 PHP
PHP 面向对象程序设计(oop)学习笔记(三) - 单例模式和工厂模式
2014/06/12 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十三)
2014/06/26 PHP
php通过Chianz.com获取IP地址与地区的方法
2015/01/14 PHP
ThinkPHP框架里隐藏index.php
2016/04/12 PHP
统一接口:为FireFox添加IE的方法和属性的js代码
2007/03/25 Javascript
JS 控制CSS样式表
2009/08/20 Javascript
js 效率组装字符串 StringBuffer
2009/12/23 Javascript
js前台分页显示后端JAVA数据响应
2013/03/18 Javascript
jquery三个关闭弹出层的小示例
2013/11/05 Javascript
js防止页面被iframe调用的方法
2014/10/30 Javascript
jQuery操作表单常用控件方法小结
2015/03/23 Javascript
浅析jquery如何判断滚动条滚到页面底部并执行事件
2016/04/29 Javascript
D3.js实现柱状图的方法详解
2016/09/21 Javascript
在js中实现邮箱格式的验证方法(推荐)
2016/10/24 Javascript
用jQuery实现优酷首页轮播图
2017/01/09 Javascript
BootStrap中Table隐藏后显示问题的实现代码
2017/08/31 Javascript
vue.js select下拉框绑定和取值方法
2018/03/03 Javascript
在微信小程序中使用mqtt服务的方法
2019/12/13 Javascript
布同 Python中文问题解决方法(总结了多位前人经验,初学者必看)
2011/03/13 Python
Python中XlsxWriter模块简介与用法分析
2018/04/24 Python
python实现两个经纬度点之间的距离和方位角的方法
2019/07/05 Python
如何用Python徒手写线性回归
2021/01/25 Python
python快速安装OpenCV的步骤记录
2021/02/22 Python
html5桌面通知(Web Notifications)实例解析
2014/07/07 HTML / CSS
canvas实现扭蛋机动画效果的示例代码
2018/10/17 HTML / CSS
妇产科护士自我鉴定
2013/10/15 职场文书
技校毕业生自荐信
2014/06/03 职场文书
中国在我心中演讲稿
2014/09/13 职场文书
单位单身证明样本
2014/10/11 职场文书
2015年幼儿园后勤工作总结
2015/04/25 职场文书
小学一年级班主任工作经验交流材料
2015/11/02 职场文书
班主任远程培训研修日志
2015/11/13 职场文书
导游词之长城八达岭
2019/09/24 职场文书