You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React实现点击按钮后禁用、后端响应后恢复的方案问询

React表单防重复提交:Save按钮禁用实现方案

核心思路

  • 用React的useState钩子维护按钮的禁用状态
  • 点击Save按钮后立即禁用按钮,避免重复点击触发后端接口
  • 后端请求完成(无论成功/失败)后,恢复按钮可用状态

具体代码实现

假设你的CustomButton组件支持disabled、onClick和label属性,先给出组件示例(如果你的组件已有这些属性,可直接跳过):

// CustomButton.jsx
const CustomButton = ({ label, disabled, onClick }) => {
  return (
    <button
      type="button"
      disabled={disabled}
      onClick={onClick}
      // 保留你原有的样式类名
      className="custom-button"
    >
      {label}
    </button>
  );
};

export default CustomButton;

接下来是包含表单的父组件实现:

// SaveForm.jsx
import { useState } from 'react';
import CustomButton from './CustomButton';

const SaveForm = () => {
  // 存储表单数据,根据你的实际字段调整
  const [formData, setFormData] = useState({
    title: '',
    content: ''
  });
  // 控制按钮禁用状态:true为禁用,false为可用
  const [isSaving, setIsSaving] = useState(false);

  // 处理表单输入变更
  const handleInputChange = (e) => {
    const { name, value } = e.target;
    setFormData(prev => ({ ...prev, [name]: value }));
  };

  // 处理保存逻辑
  const handleSave = async () => {
    // 点击后立即禁用按钮
    setIsSaving(true);
    try {
      // 调用后端保存接口,替换成你的实际接口地址和请求配置
      const res = await fetch('/api/submit-form', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json'
        },
        body: JSON.stringify(formData)
      });

      if (!res.ok) throw new Error('保存请求失败');
      // 保存成功后的操作,比如提示用户
      alert('表单保存成功');
    } catch (err) {
      // 保存失败的处理,比如打印错误、提示用户
      console.error('保存出错:', err);
      alert('保存失败,请稍后重试');
    } finally {
      // 无论请求成功还是失败,都恢复按钮可用
      setIsSaving(false);
    }
  };

  return (
    <form>
      {/* 你的表单输入项,根据实际需求调整 */}
      <div>
        <label>标题:</label>
        <input
          type="text"
          name="title"
          value={formData.title}
          onChange={handleInputChange}
        />
      </div>
      <div>
        <label>内容:</label>
        <textarea
          name="content"
          value={formData.content}
          onChange={handleInputChange}
        />
      </div>
      {/* 使用CustomButton,传入禁用状态和点击事件 */}
      <CustomButton
        label={isSaving ? '保存中...' : 'Save'}
        disabled={isSaving}
        onClick={handleSave}
      />
    </form>
  );
};

export default SaveForm;

关键说明

  • isSaving状态:直接绑定按钮的disabled属性,点击后立刻设为true,彻底阻止重复点击
  • async/await + try/catch/finally:确保后端请求无论成功还是失败,最终都会把isSaving设回false,避免按钮一直处于禁用状态
  • 动态按钮文本:保存过程中显示“保存中...”,让用户清楚当前状态,提升体验

内容的提问来源于stack exchange,提问作者Abcd Efgh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 22:00:56