当前位置: 首页 > 知识库问答 >
问题:

ReactJs:防止多次按下按钮

潘坚白
2023-03-14

在React组件中,我有一个按钮,用于在单击时通过AJAX发送一些数据。我只需要第一次使用,即在第一次使用后禁用按钮。

我是如何做到这一点的:

var UploadArea = React.createClass({

  getInitialState() {
    return {
      showUploadButton: true
    };
  },

  disableUploadButton(callback) {
    this.setState({ showUploadButton: false }, callback);
  },

  // This was simpler before I started trying everything I could think of
  onClickUploadFile() {
    if (!this.state.showUploadButton) {
      return;
    }
    this.disableUploadButton(function() {
      $.ajax({
        [...]
      });

    });
  },

  render() {
    var uploadButton;
    if (this.state.showUploadButton) {
      uploadButton = (
        <button onClick={this.onClickUploadFile}>Send</button>
      );
    }

    return (
      <div>
        {uploadButton}
      </div>
    );
  }

});

我认为发生的是状态变量show UploadButton没有立即更新,React文档说这是预期的。

我如何强制按钮在被点击的瞬间被禁用或完全消失?

共有3个答案

唐默
2023-03-14

测试为工作状态:http://codepen.io/zvona/pen/KVbVPQ

class UploadArea extends React.Component {
  constructor(props) {
    super(props)

    this.state = {
      isButtonDisabled: false
    }
  }

  uploadFile() {
    // first set the isButtonDisabled to true
    this.setState({
      isButtonDisabled: true
    });
    // then do your thing
  }

  render() {
    return (
      <button
        type='submit'
        onClick={() => this.uploadFile()}
        disabled={this.state.isButtonDisabled}>
        Upload
      </button>
    )
  }
}

ReactDOM.render(<UploadArea />, document.body);
阎善
2023-03-14

您可以做的是在单击后禁用按钮,并将其留在页面中(不可单击元素)。

要实现这一点,您必须向button元素添加ref

<button ref="btn" onClick={this.onClickUploadFile}>Send</button>

然后在onClickUploadFile函数上禁用按钮

this.refs.btn.setAttribute("disabled", "disabled");

然后,您可以相应地设置禁用按钮的样式,以便使用

.btn:disabled{ /* styles go here */}

如果需要,请确保重新启用

this.refs.btn.removeAttribute("disabled");

更新:React中处理REF的首选方法是使用函数而不是字符串。

<button 
  ref={btn => { this.btn = btn; }} 
  onClick={this.onClickUploadFile}
>Send</button>


this.btn.setAttribute("disabled", "disabled");
this.btn.removeAttribute("disabled");

更新:使用react钩子

import {useRef} from 'react';
let btnRef = useRef();

const onBtnClick = e => {
  if(btnRef.current){
    btnRef.current.setAttribute("disabled", "disabled");
  }
}

<button ref={btnRef} onClick={onBtnClick}>Send</button>

下面是一个使用您提供的代码的小示例https://jsfiddle.net/69z2wepo/30824/

欧阳成弘
2023-03-14

解决方案是在进入处理程序后立即检查状态。React保证设置状态

// In constructor
this.state = {
    disabled : false
};


// Handler for on click
handleClick = (event) => {
    if (this.state.disabled) {
        return;
    }
    this.setState({disabled: true});
    // Send     
}

// In render
<button onClick={this.handleClick} disabled={this.state.disabled} ...>
    {this.state.disabled ? 'Sending...' : 'Send'}
<button>
 类似资料:
  • 问题内容: 在我的React组件中,我有一个按钮,当单击该按钮时,它会通过AJAX发送一些数据。我只需要第一次发生,即在首次使用后禁用该按钮。 我如何尝试做到这一点: 我认为发生的事情是状态变量没有立即更新,这是React文档所说的预期。 我如何强制按钮被禁用或在单击按钮时立即消失? 问题答案: 您可以做的是单击该按钮后将其禁用,然后将其保留在页面中(不可单击的元素)。 为此,您必须向按钮元素添加

  • 问题内容: 昨天我发布了一个问题,关于必须按下两次按钮才能使其正常工作。我得到了很好的帮助,这是stackoverflow的标志,但是问题仍然存在。我将代码缩减到最低限度,问题仍然存在。我仔细阅读了BalusC的建议,希望能在表单内找到表单。我当然看不到任何东西,所以我将发布我的代码,以希望更多的眼睛看到一些东西。 我有一个模板,可以从“欢迎”(登录部分)中调用。这将转到具有命令按钮的userIn

  • 我们有一个Swing应用程序,它通过单击链接从Web应用程序启动。该链接只是一个JNLP url。Apache下的四台服务器上托管着一个jar文件。它们在负载平衡器下。即使同一个jar承载着相同的时间戳,但对JNLP的每个请求或多或少都会下载jar。通常情况下,如果jar中没有变化,JavaWebStart只下载一次,后续的请求可以在不下载的情况下工作。它还检查了哪些信息,以便与服务器版本和jar

  • 问题内容: 当用户单击登录或注册按钮时,我试图阻止多个请求。这是我的代码,但是不起作用。只是第一次工作正常,然后返回false。 有任何想法吗?谢谢! 问题答案: 问题在这里: 不再指向按钮。

  • 我目前正在做一个个人投资组合,我试图制作一个按钮,如果你点击它,应该下载一份简历。 代码 让用户下载该文件。 我在REACTJS中工作,创建react应用程序

  • 这就是我的表单的样子: 如果用户快速按下提交按钮10次,表单也将提交10次。我尝试将添加到submit按钮和下面的脚本中,但这并不能起到任何作用: 有什么解决方法吗?