使用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 相关文章推荐
分享一个我自己写的ToolTip提示插件(附源码)
Jan 20 Javascript
简单漂亮的js弹窗可自由拖拽且兼容大部分浏览器
Oct 22 Javascript
jquery基础教程之数组使用详解
Mar 10 Javascript
使用script的src实现跨域和类似ajax效果
Nov 10 Javascript
jQuery手动点击实现图片轮播特效
Apr 20 Javascript
浅谈JavaScript异步编程
Jan 20 Javascript
JS简单实现点击跳转登陆邮箱功能的方法
Oct 31 Javascript
vue.js项目打包上线的图文教程
Nov 16 Javascript
弱类型语言javascript中 a,b 的运算实例小结
Aug 07 Javascript
Centos7 安装Node.js10以上版本的方法步骤
Oct 15 Javascript
解决vue-cli输入命令vue ui没效果的问题
Nov 17 Javascript
vue实现广告栏上下滚动效果
Nov 26 Vue.js
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的memory_limit限制的方法分享
2012/02/21 PHP
php生成EAN_13标准条形码实例
2013/11/13 PHP
php递归创建目录的方法
2015/02/02 PHP
PHP之多条件混合筛选功能的实现方法
2019/10/09 PHP
javascript 动态添加事件代码
2008/11/30 Javascript
jquery中获取元素的几种方式小结
2011/07/05 Javascript
javascript重复绑定事件造成的后果说明
2013/03/02 Javascript
Javascript浅谈之this
2013/12/17 Javascript
jquery创建表格(自动增加表格)代码分享
2013/12/25 Javascript
javascript判断变量是否有值的方法
2015/04/20 Javascript
three.js实现围绕某物体旋转
2017/01/25 Javascript
js链表操作(实例讲解)
2017/08/29 Javascript
JS同步、异步、延迟加载的方法
2018/05/05 Javascript
NVM安装nodejs的方法实用步骤
2019/01/16 NodeJs
layui清除radio的选中状态实例
2019/11/14 Javascript
nodejs脚本centos开机启动实操方法
2020/03/04 NodeJs
Vue动态加载图片在跨域时无法显示的问题及解决方法
2020/03/10 Javascript
JavaScript eval()函数定义及使用方法详解
2020/07/07 Javascript
vue+vant实现购物车全选和反选功能
2020/11/17 Vue.js
[01:00:25]2018DOTA2亚洲邀请赛3月30日 小组赛A组 VG VS Liquid
2018/03/31 DOTA
跟老齐学Python之玩转字符串(2)更新篇
2014/09/28 Python
利用Opencv中Houghline方法实现直线检测
2018/02/11 Python
python和shell获取文本内容的方法
2018/06/05 Python
使用 pytorch 创建神经网络拟合sin函数的实现
2020/02/24 Python
python GUI库图形界面开发之PyQt5布局控件QGridLayout详细使用方法与实例
2020/03/06 Python
python爬虫实例之获取动漫截图
2020/05/31 Python
万得城电器土耳其网站:欧洲第一大电子产品零售商
2016/10/07 全球购物
Lookfantastic香港官网:英国知名美妆购物网站
2018/06/19 全球购物
《李时珍夜宿古寺》教学反思
2014/04/09 职场文书
2014年党课学习心得体会
2014/07/08 职场文书
婚前协议书范本两则
2014/10/16 职场文书
出差报告格式模板
2014/11/06 职场文书
公司酒会主持词
2015/07/02 职场文书
如何书写公司员工保密协议?
2019/06/27 职场文书
Django实现聊天机器人
2021/05/31 Python
MySQL数据库配置信息查看与修改方法详解
2022/06/25 MySQL