使用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 hasFocus使用实例
Jun 29 Javascript
图片在浏览器中底部对齐 解决方法之一
Nov 30 Javascript
解析JSON对象与字符串之间的相互转换
Dec 18 Javascript
javascript中replace( )方法的使用
Apr 24 Javascript
jQuery实现Meizu魅族官方网站的导航菜单效果
Sep 14 Javascript
jQuery实现将div中滚动条滚动到指定位置的方法
Aug 10 Javascript
jQuery在ie6下无法设置select选中的解决方法详解
Sep 20 Javascript
jquery广告无缝轮播实例
Jan 05 Javascript
AngularJS使用ng-repeat遍历二维数组元素的方法详解
Nov 11 Javascript
微信小程序 setData 对 data数据影响问题
Apr 18 Javascript
layui 图片上传+表单提交+ Spring MVC的实例
Sep 21 Javascript
Javascript webpack动态import
Apr 19 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 数组遍历的差异(array_diff 的实现)
2008/03/23 PHP
win平台安装配置Nginx+php+mysql 环境
2016/01/12 PHP
PHP数组生成XML格式数据的封装类实例
2016/11/10 PHP
PHP扩展mcrypt实现的AES加密功能示例
2019/01/29 PHP
PHP+百度AI OCR文字识别实现了图片的文字识别功能
2019/05/08 PHP
tp5.1 框架数据库高级查询技巧实例总结
2020/05/25 PHP
JavaScript入门教程(1) 什么是JS
2009/01/31 Javascript
常见浏览器多长时间会提示“脚本运行时间过长”总结
2014/04/29 Javascript
NodeJS学习笔记之FS文件模块
2015/01/13 NodeJs
BootStrap实现手机端轮播图左右滑动事件
2016/10/13 Javascript
js querySelector() 使用方法
2016/12/21 Javascript
Three.js的使用及绘制基础3D图形详解
2017/04/27 Javascript
Django与Vue语法的冲突问题完美解决方法
2017/12/14 Javascript
浅谈ElementUI中switch回调函数change的参数问题
2018/08/24 Javascript
JavaScript从原型到原型链深入理解
2019/06/03 Javascript
d3.js实现图形拖拽
2019/12/19 Javascript
通过js随机函数Math.random实现乱序
2020/05/19 Javascript
如何在postman测试用例中实现断言过程解析
2020/07/09 Javascript
Vue 实现创建全局组件,并且使用Vue.use() 载入方式
2020/08/11 Javascript
python的描述符(descriptor)、装饰器(property)造成的一个无限递归问题分享
2014/07/09 Python
Python读写及备份oracle数据库操作示例
2018/05/17 Python
pyhanlp安装介绍和简单应用
2019/02/22 Python
Python命令行click参数用法解析
2019/12/19 Python
如何使用python代码操作git代码
2020/02/29 Python
Python中无限循环需要什么条件
2020/05/27 Python
Django REST Framework 分页(Pagination)详解
2020/11/30 Python
Levi’s西班牙官方网站:李维斯,著名的牛仔裤品牌
2020/08/20 全球购物
写好自荐信的要点
2013/11/06 职场文书
党员自我批评与反省材料
2014/02/10 职场文书
大学生在校学习的自我评价
2014/02/18 职场文书
材料专业毕业生求职信
2014/02/26 职场文书
2019个人工作计划书的格式及范文!
2019/07/04 职场文书
创业计划书之美甲店
2019/09/20 职场文书
详解Django的MVT设计模式
2021/04/29 Python
试了下Golang实现try catch的方法
2021/07/01 Golang
OpenStack虚拟机快照和增量备份实现方法
2022/04/04 Servers