javascript - ReactJs 自定义提交按钮组件不起作用

标签 javascript reactjs typescript es6-promise

我正在尝试创建一个自定义提交按钮组件,该组件将自行处理按钮的禁用/启用。到目前为止我得到了这个:

按钮组件:

import * as React from 'react';
import Promise = require('promise');

let isDisabled = false;

const buttonClickHandler = onClick => {
  return new Promise((resolve, reject) => {
    console.log('inside promise');
    isDisabled = true;
    onClick();
    return resolve(true);
  });
};

export const SubmitButton = ({
  type,
  className,
  onClick,
  buttonStyle = {},
  children
}) => {
  return (
    <button
      type={type || 'submit'}
      className={className}
      onClick={() =>
        buttonClickHandler(onClick).then(() => {
          console.log('after promise');
          isDisabled = false;
        })
      }
      style={buttonStyle}
      disabled={isDisabled}
    >
      {children}
    </button>
  );
};

export default SubmitButton;

我这样调用它:

<SubmitButton type="button" className="btn btn-primary" onClick={this.submitForm}>
Submit
</SubmitButton>

表单提交函数是:

public submitForm = () => {
  setTimeout(() => {
    console.log('waiting done');
  }, 5000);
};

所以预期的输出是

内部 promise
----等待 5000 毫秒----
等待完成
promise 之后

但我看到
内部 promise
promise 之后
----等待 5000 毫秒----
等待完成

所以我做错了什么?该按钮也没有被禁用。

最佳答案

需要进行一些更正:

  • isDisabled 需要是一个状态而不是全局变量
  • buttonClickHandler 函数移至 SubmitButton 组件中
  • SubmmitButton 组件内的 onClick() 需要返回一个 Promise

您的 code is here 的工作副本

export const SubmitButton = ({
  type,
  className,
  onClick,
  buttonStyle = {},
  children
}) => {
  const [isDisabled, setIsDisabled] = useState(false);
  const buttonClickHandler = onClick => {
    // return new Promise((resolve, reject) => {
    console.log("inside promise");
    setIsDisabled(true);
    return onClick();
    // });
  };
  return (
    <button
      type={type || "submit"}
      className={className}
      onClick={() =>
        buttonClickHandler(onClick).then(() => {
          console.log("after promise");
          setIsDisabled(false);
        })
      }
      style={buttonStyle}
      disabled={isDisabled}
    >
      {children}
    </button>
  );
};

export default SubmitButton;

使用

const submitForm = () => {
    return new Promise((res, rej) => {
      setTimeout(() => {
        console.log("waiting done");
        res(true);
      }, 5000);
    });
  };

关于javascript - ReactJs 自定义提交按钮组件不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61472938/

相关文章:

javascript - javascript如何初始化变量打印未定义?

javascript - 当键入 ="category"时,XAxis 在 Rechart 的散点图中重复自身

angular - Ionic 4路由到带有选项卡的 View 会触发整页重新加载

typescript - TypeScript 中泛型子类型的推断

typescript - 如何从Typescript中的日期减去n天

javascript - 如何考虑当旁边的用户名太长时自动加宽搜索字段的脚本

javascript - 限制 Indesign 项目仅导出为图像

javascript - randomString 未在 HTMLInputElement.onclick Typescript 中定义

javascript - 如何不映射缺少子值的对象

javascript - 如何在 React Native 中将样式对象与内联样式结合起来?