原文链接:https://bobbyhadz.com/blog/react-open-file-input-on-button-click

作者:Borislav Hadzhiev

正文从这开始~

总览

在React中,通过点击按钮,打开文件输入框:

  1. 在button元素上设置onClick属性。
  2. 在文件输入框上设置ref属性。
  3. 当按钮被点击时,打开文件输入框。比如说,inputRef.current.click() 。
import {useRef} from 'react';

const App = () => {
const inputRef = useRef(null); const handleClick = () => {
// ️ open file input box on click of other element
inputRef.current.click();
}; const handleFileChange = event => {
const fileObj = event.target.files && event.target.files[0];
if (!fileObj) {
return;
} console.log('fileObj is', fileObj); // ️ reset file input
event.target.value = null; // ️ is now empty
console.log(event.target.files); // ️ can still access file object here
console.log(fileObj);
console.log(fileObj.name);
}; return (
<div>
<input
style={{display: 'none'}}
ref={inputRef}
type="file"
onChange={handleFileChange}
/> <button onClick={handleClick}>Open file upload box</button>
</div>
);
}; export default App;

click

我们使用useRef钩子访问文件input元素。需要注意的是,我们必须访问ref对象上的current属性,以获得对我们设置ref属性的文件input元素的访问。

当我们将ref属性传递到元素上时,比如说,<input type="file" ref={myRef} /> 。React将ref对象的.current属性设置为相应的DOM节点。

我们调用了click()方法,比如:ref.current.click() 。以此来模拟input元素上的鼠标点击事件。

当对一个元素使用click()方法时,它会触发该元素的点击事件。当一个文件input的点击事件被触发时,文件上传对话框就会打开。

需要注意的是,我们对input元素的display属性设置为none,来隐藏该元素。

现在,当用户点击button元素时,我们在input元素上使用ref对象来模拟click事件,并且文件上传对话框会被打开。

总结

该方法可以在任何类型元素上生效,比如说div或者一个图标。只需在元素上设置onClick属性,当元素被点击时,就可以文件input上模拟点击。

React技巧之打开文件输入框的更多相关文章

  1. _技巧_SublimeText_打开文件乱码解决

    macOS属于Unix分支,默认使用UTF-8编码,当从Window 或者其他Linux 或 Unix系统 拷贝文件过来,由于Window系统使用GBK或者GB2312中文编码,所以会出现乱码现象. ...

  2. React + js-xlsx构建Excel文件上传预览功能

    首先要准备react开发环境以及js-xlsx插件 1. 此处省略安装react安装步骤 2.下载js-xlsx插件 yarn add xlsx 或者 npm install xlsx 在项目中引入 ...

  3. # codeblocks 使用技巧+伪单文件编译

    codeblocks 使用技巧+伪单文件编译 shift+F2打开和隐藏左侧工作空间 F2 打开和隐藏下面控制台 CTRL+Shift+c 注释,CTRL+Shift+x取消注释 view->p ...

  4. [原创]新版PageOffice V4.0为什么用弹出窗口的方式打开文件?

    前的包含文档处理功能的Web办公系统,在打开文档的时候,一部分系统是采用Office文档嵌入到主窗口页面中右侧工作区域的方式,另一部分系统采用的是弹出新的浏览器窗口,里面完整的嵌入Office文件的打 ...

  5. VS15 preview 5打开文件夹自动生成slnx.VC.db SQLite库疑惑?求解答

    用VS15 preview 5打开文件夹(详情查看博客http://www.cnblogs.com/zsy/p/5962242.html中配置),文件夹下多一个slnx.VC.db文件,如下图: 本文 ...

  6. 利用注册表在右键添加VS15的快捷方式打开文件夹

    1.简介 最近安装VS15 Preview 5,本版本可以打开"文件夹" 是否可以向Visual Studio Code一样在文件夹或文件右键菜单添加"Open with ...

  7. 新手,Visual Studio 2015 配置Boost库,如何编译和选择,遇到无法打开文件“libboost_thread-vc140-mt-gd-1_63.lib“的解决办法

    1,到官网下载最新的boost,www.boost.org 这里我下载的1-63版本. 2,安装,解压后运行bootstrap.bat文件.稍等一小会就OK. 3,编译boost库.注意一定要使用VS ...

  8. 【Win10应用开发】通过拖放来打开文件

    除了可以使用XXXFilePicker来浏览文件外,其实在UWP APP中,也可以向传统Windows窗口一样,通过拖放的方式来打开文件. 处理过程和WPF的原理差不多,毕竟都是一脉相承,于是,在学习 ...

  9. Visual Studio 打开解决方案后 弹出框显示 "正在打开文件..." 迟迟没反应 的解决方法

    Visual Studio 打开解决方案后 弹出框显示 "正在打开文件...",任务管理器的devenv进程又很正常,不会显示"未响应". 而IDE的左下角有个 ...

随机推荐

  1. 日志、第三方模块(openpyxl模块)

    目录 1.日志模块 2.第三方模块 内容 日志模块 1.日志模块的主要组成部分 1.logger对象:产生日志 无包装的产品 import logging logger = logging.getLo ...

  2. 4.Docker容器学习之Dockerfile入门到放弃

    原文地址: 点击直达 0x01 Dockerfile 编写 描述:Dockerfile是一个文本格式的配置文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内 ...

  3. Blazor 使用拖放(drag and drop)上传文件

    在很多上传文件的应用实例中, 都可以看到[拖放文件到此上传]这种骚功能 ,今天我们就来试试Blazor能不能完成这个想法. 简述HTML5拖放 拖放是HTML5标准的一部分,任何元素都能够拖放,也能够 ...

  4. ArcGIS使用技巧(二)——数据恢复

    新手,若有错误还请指正! ArcGIS工程文件中图层的数据源位置移动之后,会显示红叹号(图1),需要进行数据恢复,就体现出之前所说的勾选"Store relative pathnames t ...

  5. 基础学习:MYSQL命令大全(持续更新中---最近一次:2019.12.6)

    启动mysql : mysql -hlocalhost -uroot -p创建数据库:create database 数据库名字;指定要操作的数据库:use 数===据库名字;查看数据表建表语句:sh ...

  6. 【面试普通人VS高手系列】请说一下你对分布式锁的理解,以及分布式锁的实现

    一个工作了7年的Java程序员,私信我关于分布式锁的问题. 一上来就两个灵魂拷问: Redis锁超时怎么办? Redis主从切换导致锁失效怎么办? 我说,别着急,这些都是小问题. 那么,关于" ...

  7. [AcWing 36] 合并两个排序的链表

    点击查看代码 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * L ...

  8. 网络爬虫、Pandas

    网络爬虫.Pandas Pandas 是 Python 语言的一个扩展程序库,用于数据分析. Pandas 是一个开放源码.BSD 许可的库,提供高性能.易于使用的数据结构和数据分析工具. Panda ...

  9. cookie、sessionStorage、localStorage的区别?

    数据存储位置 三者都是存储在游览器本地的 区别在于cookie是服务器端写入的,而sessionStorage.localStorage是由前端写入的 生命周期 cookie的生命周期是由服务器端写入 ...

  10. Vue图片浏览组件v-viewer使用

    简单介绍v-viewer的两种使用方法: Demo 安装依赖: npm install v-viewer --save 全局引入 import Viewer from 'v-viewer' impor ...