Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 在React/Bootstrap 4中,禁用按钮以防止重复表单提交的正确方法是什么?_Reactjs_Button_Bootstrap 4_Form Submit_Disable - Fatal编程技术网

Reactjs 在React/Bootstrap 4中,禁用按钮以防止重复表单提交的正确方法是什么?

Reactjs 在React/Bootstrap 4中,禁用按钮以防止重复表单提交的正确方法是什么?,reactjs,button,bootstrap-4,form-submit,disable,Reactjs,Button,Bootstrap 4,Form Submit,Disable,我使用的是React 16.13和Bootstrap 4。我有以下表格容器 const FormContainer = (props) => { ... const handleFormSubmit = (e) => { e.preventDefault(); CoopService.save(coop, setErrors, function(data) { const result = data; history.push({

我使用的是React 16.13和Bootstrap 4。我有以下表格容器

const FormContainer = (props) => {
    ...
  const handleFormSubmit = (e) => {
    e.preventDefault();
    CoopService.save(coop, setErrors, function(data) {
      const result = data;
      history.push({
        pathname: "/" + result.id + "/people",
        state: { coop: result, message: "Success" },
      });
      window.scrollTo(0, 0);
    });
  };

  return (
    <div>
      <form className="container-fluid" onSubmit={handleFormSubmit}>
        <FormGroup controlId="formBasicText">
    ...
          {/* Web site of the cooperative */}
          <Button
            action={handleFormSubmit}
            type={"primary"}
            title={"Submit"}
            style={buttonStyle}
          />{" "}
          {/*Submit */}
        </FormGroup>
      </form>
    </div>
  );
不确定是否相关,但这是我的按钮组件。愿意改变它或以上,以帮助实施一个标准,开箱即用的方式来解决这个问题

import React from "react";
  
const Button = (props) => {
  return (
    <button
      style={props.style}
      className={
        props.type === "primary" ? "btn btn-primary" : "btn btn-secondary"
      }
      onClick={props.action}
    >
      {props.title}
    </button>
  );
};

export default Button;
Greg已经向您展示了如何使用组件状态来存储按钮是否被禁用

但是,最新版本的React使用带有挂钩的功能组件,而不是this.state或this.setState。。。。以下是您可能会采取的方法:

从“react”导入{useState}; const FormContainer=props=>{ ... const[buttonDisabled,setButtonDisabled]=useStatefalse; ... 常量handleFormSubmit=e=>{ setButtonDisabledtrue;//{setButtonDisabledfalse;setErrorserrors;},函数数据{ 常量结果=数据; 历史推送{ 路径名:/+result.id+/people, 状态:{coop:result,message:Success}, }; window.scrollTo0,0; }; }; 回来 ... { 回来 Greg已经向您展示了如何使用组件状态来存储按钮是否被禁用

但是,最新版本的React使用带有钩子的功能组件,而不是this.state或this.setState……下面是您可能的操作方法:

从“react”导入{useState}; const FormContainer=props=>{ ... const[buttonDisabled,setButtonDisabled]=useStatefalse; ... 常量handleFormSubmit=e=>{ setButtonDisabledtrue;//{setButtonDisabledfalse;setErrorserrors;},函数数据{ 常量结果=数据; 历史推送{ 路径名:/+result.id+/people, 状态:{coop:result,message:Success}, }; window.scrollTo0,0; }; }; 回来 ... { 回来
正如其他人所说,禁用按钮是一个完美的解决方案。但我不喜欢按钮在提交时更改其视觉效果


您应该改为设置按钮的css属性指针事件:无,这将关闭所有事件的发出。您可以在提交完成或失败后删除该属性。

正如其他人所说,禁用按钮是一个完美的解决方案。但我不喜欢按钮在提交时更改其视觉效果


您应该改为设置按钮的css属性指针事件:无,这将关闭所有事件的发出。提交完成或失败后,您可以删除该属性。

另一种解决方案是使用模式,因为您一次只能打开一个。我经常使用此方法保存表单。谢谢@GregH。您的建议是什么ems就像一个定制的解决方案,我很喜欢,但我觉得我不是第一个想要这样的解决方案的人-你认为有什么现成的解决方案或方法可以让我构建东西来最小化我必须编写的定制代码的数量以适应这样的东西吗?请参阅避免在react中多次单击按钮的方法使用带状态的禁用道具。将保存功能更改为异步。在存储集顶部,保存状态为true按钮将被禁用,保存完成后,将状态设置为false enable按钮。谢谢,但您链接到的答案似乎使用了this.setState范例,而我使用的是较新的常量[myItem setMyItem]=useState…范例不确定将这两件事称为.Re:const[myItem setMyItem]=useState…的正确方式是什么。它非常相似。而不是这个.setState{state:newState}只需设置MyItemNewState另一种解决方案可能是使用模式,因为一次只能打开一个。我经常使用这种方法保存表单。谢谢@GregH。你的建议似乎是一种自定义解决方案,我很喜欢,但我觉得我不是第一个想要这样的解决方案的人-你认为有现成的解决方案吗我可以用什么方法来组织事情,以最大限度地减少我必须编写的自定义代码量,以适应这样的情况?请参阅避免在react中多次单击按钮的方法是使用带状态的disabled prop。将保存函数更改为async。在存储集顶部,保存状态为true的按钮将被禁用,一旦完成h保存将状态设置为false enable按钮。谢谢,但是您链接到的答案似乎使用了this.setState范例,而我使用的是较新的const[myItem setMyItem]=useState…范例不确定将这两个东西称为的正确方式。Re:const[myItem setMyItem]=useState…非常相似。只需执行setMyItemnewState即可,而不是此.setState{state:newState}
import React from "react";
  
const Button = (props) => {
  return (
    <button
      style={props.style}
      className={
        props.type === "primary" ? "btn btn-primary" : "btn btn-secondary"
      }
      onClick={props.action}
    >
      {props.title}
    </button>
  );
};

export default Button;