Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在文件上载开始/完成时显示/隐藏一个旋转器

在文件上载开始/完成时显示/隐藏一个旋转器
EN

Stack Overflow用户
提问于 2018-05-09 08:38:26
回答 5查看 4K关注 0票数 5

我使用这个反应组分将文件上传到浏览器(而不是服务器)。这个组件是react jsonschema-格式库的一部分,所以我不能更改源代码。此组件的render方法如下所示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  render() {
    const { multiple, id, readonly, disabled, autofocus } = this.props;
    const { filesInfo } = this.state;
    return (
      <div>
        <p>
          <input
            ref={ref => (this.inputRef = ref)}
            id={id}
            type="file"
            disabled={readonly || disabled}
            onChange={this.onChange}
            defaultValue=""
            autoFocus={autofocus}
            multiple={multiple}
          />
        </p>
        <FilesInfo filesInfo={filesInfo} />
      </div>
    );
  }

该组件接受一个或多个文件作为输入,base64对它们进行编码,并将编码的文件存储在内存中。

但是,如果用户选择一个大文件(例如,5MB),则在处理过程中会出现明显的延迟。我想在这个处理开始时显示一个旋转器,并在它完成时隐藏它,但是我找不到显示/隐藏自旋器的相关事件。

如果是相关的话,我有一个到小部件的ref,并且可以使用它通过myWidgetRef.inputRef将一个ref发送到<input>字段。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-05-13 17:10:29

您可以将change事件侦听器添加到输入引用中,当选择文件时将调用该事件侦听器。

仅在上传完成后才调用作为支柱传递的onChange函数。

然后使用onChange支柱来处理处理完成。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React from "react";
import { render } from "react-dom";
import Form from "react-jsonschema-form";
import FileWidget from "react-jsonschema-form/lib/components/widgets/FileWidget";

class MyForm extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      processing: false
    };
    this.inputChanged = this.inputChanged.bind(this);
  }

  inputChanged() {
    console.log("processing");
    this.setState({ processing: true });
  }

  componentDidMount() {
    this.fileWidget.inputRef.addEventListener("change", this.inputChanged);
  }

  componentWillUnmount() {
    this.fileWidget.inputRef.removeEventListener("change", this.inputChanged);
  }

  render() {
    return (
      <React.Fragment>
        <div>Is processing: {this.state.processing + ""}</div>
        <Form
          schema={{
            type: "object",
            properties: {
              file: {
                type: "string",
                format: "data-url"
              }
            }
          }}
          widgets={{
            FileWidget: props => (
              <FileWidget
                {...props}
                ref={ref => {
                  this.fileWidget = ref;
                }}
                onChange={() => {
                  console.log("processed");
                  this.setState({ processing: false });
                }}
              />
            )
          }}
          liveValidate
        />
      </React.Fragment>
    );
  }
}

render(<MyForm />, document.getElementById("root"));
票数 7
EN

Stack Overflow用户

发布于 2018-05-09 09:09:23

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
onChange = () => {
    this.setState({uploading: true})
    //upload fetch call
   fetch().then(results => {//this is dummy call
     this.setState({uploading: false})
   })
}

render() {
    const { multiple, id, readonly, disabled, autofocus } = this.props;
    const { filesInfo } = this.state;
    return (
      <div>
        <p>
        {this.state.uploading ? <div className="progress"></div> : null}
          <input
            ref={ref => (this.inputRef = ref)}
            id={id}
            type="file"
            disabled={readonly || disabled}
            onChange={this.onChange}
            defaultValue=""
            autoFocus={autofocus}
            multiple={multiple}
          />
        </p>
        <FilesInfo filesInfo={filesInfo} />
      </div>
    );
  }
票数 3
EN

Stack Overflow用户

发布于 2018-05-20 01:06:57

据我所知,您正在客户端处理这个大型文件。

因此,对于您来说,最简单的解决方案是在处理开始之前放置加载标志,在处理结束后删除它。

完成此操作后-您将遇到标记更改没有反映到DOM状态,因为呈现是延迟的。

因此,解决方案将是将代码转换为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
setLoadingFlag();
doComputing();
removeLoadingFlag();

要异步表单:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
setLoadingFlag();
setTimeout(() => {
    doComputing();
    removeLoadingFlag();
}, 0)

这将允许对呈现加载程序作出反应。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50258231

复制
相关文章
使用Fiddler对Android手机抓包
由于智能手机权限限制,使用传统方法在 Android 手机上抓包不得不对系统进行 root ,并且最终需要导出到电脑查看以及分析。相较而言,使用 Fiddler 辅助抓包操作简单易行,并且无需对手机进行 root ,同时兼容 Android 以及 IOS。使用 Fiddler 需要一台与被抓包手机处在同一局域网下的电脑辅助,并且路由器没有开启 AP 隔离。
reizhi
2022/09/26
9070
使用Fiddler对Android手机抓包
[ JavaScript ] 对闭包的理解和使用场景
首先,闭包是 JavaScript 这个语言的一个特点,主要的使用场景就是为了创建私有的变量。当然这个变量包含函数。
GavinUI
2021/04/10
1.4K0
[ JavaScript ] 对闭包的理解和使用场景
当使用junit4 对spring框架中各层进行测试时,需要添加的配置
当使用junit4 对spring框架中controller/service/mapper各层进行测试时,需要添加的配置
Theone67
2019/11/21
9420
spring之在配置Bean时如何关联不同的Bean
我们也可以在bean的内部配置相应的Bean,这个Bean就是一个内部bean,不能被外部使用。
西西嘛呦
2020/08/26
5990
spring之在配置Bean时如何关联不同的Bean
学习笔记:使用BurpSuite抓包时抓到火狐的包怎么办?
var xhr = new XMLHttpRequest(); xhr.open('get', 'https://v1.hitokoto.cn/'); xhr.onreadystatechange = function () { if (xhr.readyState === 4) { var data = JSON.parse(xhr.responseText); var hitokoto = document.getElementById('hitokoto'); hitokoto.innerText = data.hitokoto; } } xhr.send();
TRY博客-简单的网络技术
2022/09/08
1.6K0
学习笔记:使用BurpSuite抓包时抓到火狐的包怎么办?
使用webbench对不同的web服务器进行压力测试
1、webbench在linux下的安装步骤,如果安装过程失败,请检查当前用户的执行权限,如果报找不到某个目录的错,请自行创建指定的目录:
程序员一一涤生
2019/09/10
2.9K0
使用 React Hooks 时需要注意过时的闭包!
最近开源了一个 Vue 组件,还不够完善,欢迎大家来一起完善它,也希望大家能给个 star 支持一下,谢谢各位了。
前端小智@大迁世界
2021/03/04
1.9K0
使用Sentinel对Spring MVC接口进行限流
Spring Cloud Alibaba提供了中间件Sentinel,它以流量为切入点,提供了流量控制、熔断降级、系统负载保护等多个功能来保护服务的稳定性。今天就来尝试一下。
码农小胖哥
2020/10/10
2K0
使用Sentinel对Spring MVC接口进行限流
使用 AutoMapper 自动映射模型时,处理不同模型属性缺失的问题
使用 AutoMapper 可以很方便地在不同的模型之间进行转换而减少编写太多的转换代码。不过,如果各个模型之间存在一些差异的话(比如多出或缺少一些属性),简单的配置便不太行。本文帮助你解决这个问题。
walterlv
2023/10/23
6650
使用青花瓷对Android app 抓包
青花瓷window版本下载地址:http://www.pc6.com/softview/SoftView_426224.html
全栈程序员站长
2022/08/26
1.4K0
使用青花瓷对Android app 抓包
spring boot 使用 maven 打 jar 包配置
使用 ide 进行开发时,直接在ide上启动即可,如果要放到服务器上进行使用,就必须打成jar包,这里使用 maven 的打包插件进行打包。注意 <mainClass>com.devops.WebApplication</mainClass> 这行要改成你的启动类。
潇洒
2019/07/03
9730
spring boot 使用maven打jar包配置
使用 ide 进行开发时,直接在ide上启动即可,如果要放到服务器上进行使用,就必须打成jar包,这里使用 maven 的打包插件进行打包。注意 <mainClass>com.devops.WebApplication</mainClass> 这行要改成你的启动类。
潇洒
2023/10/20
2720
Spring MVC中使用header路由到不同方法
最近项目中需要针对URL进行统一化处理,其中有一条是需要根据不同的调用方提供不同的接口,但是实际上针对服务方来说,有的功能对所有渠道是一致的,有的功能是不同的。 一开始针对不同功能,我们也都放在同一个方法,但是随着渠道增多,以及不同渠道的差异增加,这种方式导致公共方法特别复杂。就连参数校验的逻辑就很长,也容易出错。 借用Spring MVC可以使用header路由的功能,我们实现了灵活的方法实现,针对一致性的功能,我们可以使用一个方法实现,有差异性的功能,可以路由到不同方法。而这些改动都对调用方透明,这样
十毛
2019/12/23
1.2K0
Spring 和 Mybatis 使用不同的数据源会怎样?
本篇文章要讨论的一个问题点, 给Spring和Mybatis设置不同的数据库数据源会怎样? 注意. 正常情况下一定要给Spring和Mybatis设置相同的数据库数据源. 案例代码位置 https:
书唐瑞
2022/06/02
5630
Spring 和 Mybatis 使用不同的数据源会怎样?
使用管家婆软件管理工厂对不同商品的价格
当企业自己的生产能力不足或者缺乏某种技术的话,就需要把某个工艺甚至整个产品交给外面的厂商去进行生产,要管理加工单位对不同商品的单价,可以参考下面说明的设置。
管家婆软件
2022/11/04
13.9K0
使用管家婆软件管理工厂对不同商品的价格
聊一聊使用Spring事物时不生效的场景
今天介绍一下Spring事物不生效的场景,事物是我们在项目中经常使用的,如果是Java的话,基本上都使用Spring的事物,不过Spring的事物如果使用不当,那么就会导致事物失效或者不回滚,最终导致数据不一致,所以很有必要去研究一下Spring事物不生效的一些场景,避免掉坑。
小四的技术之旅
2023/09/06
2250
聊一聊使用Spring事物时不生效的场景
Java 包的使用
指的是一个程序的目录,在最早的时候,如果要开发一个程序,只需要定义一个Java文件,而后在这个文件中编写所需要的类文件。
Mirror王宇阳
2020/11/12
9910
EMLOG通过不同域名使用不同的模板
只在emlog根目录的index.php简单修改就能实现,也可以做多用户二级域名调用不同的模板。当然也可以修改模板不同域名显示不同用户的文章。 $templet=Option::get('nonce_templet'); $the_host = $_SERVER['HTTP_HOST']; if ($the_host=='i.isiyuan.net') {////判断域名或者浏览器UA使用不同的前台模板 $templet='pink';//前台模板名 } define('TEMPLAT
Youngxj
2018/06/06
2.1K0
点击加载更多

相似问题

在Spring中使用不同的控制器包

10

在Spring中对多个包使用@ComponentScan时出错

119

如何在Spring中使用来自不同包的rest控制器?

23

Spring :使用@Autowire获取对不同spring实例的引用

11

对不同的版本使用不同的包iOS

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文