diff --git a/components/button/__tests__/type.test.tsx b/components/button/__tests__/type.test.tsx
index 7288bfc27287..715773c3281b 100644
--- a/components/button/__tests__/type.test.tsx
+++ b/components/button/__tests__/type.test.tsx
@@ -170,6 +170,8 @@ describe('Button', () => {
jest.useFakeTimers();
const wrapper = mount();
wrapper.update();
+ wrapper.setProps({ loading: { delay: 2000 } });
+ wrapper.update();
wrapper.setProps({ loading: false });
act(() => {
diff --git a/components/button/button.tsx b/components/button/button.tsx
index 6dd9dc5a3cec..e0afb9898882 100644
--- a/components/button/button.tsx
+++ b/components/button/button.tsx
@@ -121,6 +121,8 @@ interface CompoundedComponent
__ANT_BUTTON: boolean;
}
+type Loading = number | boolean;
+
const InternalButton: React.ForwardRefRenderFunction = (props, ref) => {
const {
loading,
@@ -138,7 +140,7 @@ const InternalButton: React.ForwardRefRenderFunction = (pr
} = props;
const size = React.useContext(SizeContext);
- const [innerLoading, setLoading] = React.useState(loading);
+ const [innerLoading, setLoading] = React.useState(!!loading);
const [hasTwoCNChar, setHasTwoCNChar] = React.useState(false);
const { getPrefixCls, autoInsertSpaceInButton, direction } = React.useContext(ConfigContext);
const buttonRef = (ref as any) || React.createRef();
@@ -163,16 +165,24 @@ const InternalButton: React.ForwardRefRenderFunction = (pr
}
};
+ // =============== Update Loading ===============
+ let loadingOrDelay: Loading;
+ if (typeof loading === 'object' && loading.delay) {
+ loadingOrDelay = loading.delay || true;
+ } else {
+ loadingOrDelay = !!loading;
+ }
+
React.useEffect(() => {
- if (typeof loading === 'object' && loading.delay) {
+ clearTimeout(delayTimeoutRef.current);
+ if (typeof loadingOrDelay === 'number') {
delayTimeoutRef.current = window.setTimeout(() => {
- setLoading(loading);
- }, loading.delay);
+ setLoading(loadingOrDelay);
+ }, loadingOrDelay);
} else {
- clearTimeout(delayTimeoutRef.current);
- setLoading(loading);
+ setLoading(loadingOrDelay);
}
- }, [loading]);
+ }, [loadingOrDelay]);
React.useEffect(() => {
fixTwoCNChar();
@@ -230,7 +240,7 @@ const InternalButton: React.ForwardRefRenderFunction = (pr
icon && !innerLoading ? (
icon
) : (
-
+
);
const kids =