查看原文
其他

使用FieleRader API创建VUE.JS文件读取器组件

翻译:李冰 新钛云服 2022-01-05

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


如果我们只是想读取一个文本文件,以便在UI级别对其进行一些琐碎的操作,那么我们就不需要将文件发送到服务器。例如,可以从文件中填充文本。


FileReaderAPI


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来访问。


文件阅读器组件

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

让我们创建一个FileReader组件,把它们放在一起:

<template>

 <label class="text-reader">

   <input type="file" @change="loadTextFromFile">

 </label>

</template>

 

<script>

export default {

 methods: {

   loadTextFromFile(ev) {

     const file = ev.target.files[0];

     const reader = new FileReader();

     reader.onload = e => this.$emit("load", e.target.result);

     reader.readAsText(file);

   }

 }

};

</script>


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



使用组件


假设您已经引入了App.vue组件,让我们使用它来演示我们的组件:

<template>

 <div id="app">

   <textarea rows="10" v-model="text"></textarea>

   <br>

   <text-reader @load="text =$event"></text-reader>

 </div>

</template>

 

<script>

import FileReader from"./FileReader";

 

export default {

 name: "app",

 data: () => ({ text: "" }),

 components: {

   FileReader

 }

};

</script>

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


奖励:给上传按钮增加样式


<input type="file"> 标签在不同的浏览器呈现方式是不同的,如果我们想要一个自定义样式,我们可以隐藏它,并用 <label>标签替换它。


隐藏input,可以使用opacity:0;css属性。使用display:blokc;或者visibility:hidden;

还需要一个positioning和z-index组合,以便把它放在标签后面。


<template>

 <label class="text-reader">

   Read File

   <input type="file" @change="loadTextFromFile">

 </label>

</template>

 

<style>

.text-reader {

 position: relative;

 overflow: hidden;

 display: inline-block;

 

 /* Fancy button style  */

 border: 2px solid black;

 border-radius: 5px;

 padding: 8px 12px;

 cursor: pointer;

}

.text-reader input {

 position: absolute;

 top: 0;

 left: 0;

 z-index: -1;

 opacity: 0;

}

</style>


在https://codesandbox.io/s/4p0k1xly4 可以看到代码和演示。


原文链接:

https://alligator.io/vuejs/file-reader-component/


了解新钛云服


厉害了,新钛云服在2018博鳌企业论坛上连获三项大奖!

新钛云服CEO冯祯旺受邀出席华东互联网峰会并发表演讲

从盛大游戏G云COO到独自创业!2018中国财经峰会专访新钛云服CEO冯祯旺

刚刚,新钛云服荣获中国财经峰会2018最具投资价值奖!

新钛云服,打造最专业的Cloud MSP+,做企业业务和云之间的桥梁

王者归来,Linux运维专家胥峰加入新钛云服!

听说,这家公司的展台直接送股票!

没错,我们就是这样豪!GOPS送小爱、整箱签名书、数百定制笔记本和手机支架

新钛云服架构师祝祥获得华为精英赛优胜奖



新钛云服出品的精品技术干货

用Audit守护进程配置和审计Linux系统

开源搜索引擎solr介绍

使用Sensu简单有效地监控云基础架构

Ceph杀手锏CRUSH和主流分布式存储一致性哈希算法

开源搜索引擎solr介绍

运维人的终身成长,从清单管理开始|万字长文!

ASP.Net性能监控和优化入门

Oracle的RMAN恢复经验分享

99%运维不知道,系统文件md5变了,竟然是因为......

超实用,物理服务器RAID扩容详解

OpenStack Rocky:专注于裸机云管理,快速升级以及硬件加速

Chef进行自动化和编排的优缺点分析

高效的容器使用需要软件定义的数据中心

Ceph BlueStore 与 FileStore:利用 Micron NVMe SSD 进行性能比较

django快速上手指南

OpenStack与ZStack深度对比:架构、部署、计算存储与网络、运维监控等

孩子通CTO李文杰:孩子通运维2.0的升级之路。

什么是云原生?

IT混合云战略:是什么、为什么,如何构建?

运行Docker:物理机vs虚拟机,五方面详细对比!


: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存