diff --git a/components/switch/__tests__/index.test.js b/components/switch/__tests__/index.test.js index dc9f9c575c..a3d5c2ead5 100644 --- a/components/switch/__tests__/index.test.js +++ b/components/switch/__tests__/index.test.js @@ -7,7 +7,7 @@ import mountTest from '../../../tests/shared/mountTest'; import rtlTest from '../../../tests/shared/rtlTest'; describe('Switch', () => { - focusTest(Switch); + focusTest(Switch, { refFocus: true }); mountTest(Switch); rtlTest(Switch); diff --git a/components/switch/index.tsx b/components/switch/index.tsx index 0139b2ef3d..a5a8f5d6a4 100755 --- a/components/switch/index.tsx +++ b/components/switch/index.tsx @@ -5,9 +5,9 @@ import omit from 'omit.js'; import LoadingOutlined from '@ant-design/icons/LoadingOutlined'; import Wave from '../_util/wave'; -import { ConfigConsumer, ConfigConsumerProps } from '../config-provider'; -import warning from '../_util/warning'; +import { ConfigContext } from '../config-provider'; import SizeContext from '../config-provider/SizeContext'; +import warning from '../_util/warning'; export type SwitchSize = 'small' | 'default'; export type SwitchChangeEventHandler = (checked: boolean, event: MouseEvent) => void; @@ -30,72 +30,51 @@ export interface SwitchProps { title?: string; } -export default class Switch extends React.Component { - static __ANT_SWITCH = true; - - private rcSwitch: typeof RcSwitch; - - constructor(props: SwitchProps) { - super(props); +interface CompoundedComponent + extends React.ForwardRefExoticComponent> { + __ANT_SWITCH: boolean; +} - warning( - 'checked' in props || !('value' in props), - 'Switch', - '`value` is not a valid prop, do you mean `checked`?', - ); - } +const Switch = React.forwardRef((props, ref) => { + warning( + 'checked' in props || !('value' in props), + 'Switch', + '`value` is not a valid prop, do you mean `checked`?', + ); - saveSwitch = (node: typeof RcSwitch) => { - this.rcSwitch = node; - }; + const { + prefixCls: customizePrefixCls, + size: customizeSize, + loading, + className = '', + disabled, + } = props; - focus() { - this.rcSwitch.focus(); - } + const { getPrefixCls, direction } = React.useContext(ConfigContext); + const size = React.useContext(SizeContext); + const prefixCls = getPrefixCls('switch', customizePrefixCls); + const loadingIcon = loading ? : null; - blur() { - this.rcSwitch.blur(); - } + const classes = classNames(className, { + [`${prefixCls}-small`]: (customizeSize || size) === 'small', + [`${prefixCls}-loading`]: loading, + [`${prefixCls}-rtl`]: direction === 'rtl', + }); - renderSwitch = ({ getPrefixCls, direction }: ConfigConsumerProps) => { - const { - prefixCls: customizePrefixCls, - size: customizeSize, - loading, - className = '', - disabled, - } = this.props; - const prefixCls = getPrefixCls('switch', customizePrefixCls); - const loadingIcon = loading ? ( - - ) : null; - return ( - - {size => { - const classes = classNames(className, { - [`${prefixCls}-small`]: (customizeSize || size) === 'small', - [`${prefixCls}-loading`]: loading, - [`${prefixCls}-rtl`]: direction === 'rtl', - }); + return ( + + + + ); +}) as CompoundedComponent; - return ( - - - - ); - }} - - ); - }; +Switch.__ANT_SWITCH = true; - render() { - return {this.renderSwitch}; - } -} +export default Switch; diff --git a/tests/shared/focusTest.js b/tests/shared/focusTest.js index c2e1c97a44..6fdaf97788 100644 --- a/tests/shared/focusTest.js +++ b/tests/shared/focusTest.js @@ -40,6 +40,9 @@ export default function focusTest(Component, { refFocus = false } = {}) { const getElement = wrapper => { let ele = wrapper.find('input').first(); + if (ele.length === 0) { + ele = wrapper.find('button').first(); + } if (ele.length === 0) { ele = wrapper.find('div[tabIndex]').first(); }