Switch组件
npm install --save react-widget-switch
import React from "react";
import Switch from "react-widget-switch";
import "react-widget-switch/style";
export default function App() {
return (
<div
className="App"
style={{
padding: 100
}}
>
<Switch />
</div>
);
}
import React from "react";
export interface SwitchProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "onChange" | "onClick"> {
/** 组件样式前缀名 */
prefixCls?: string;
/** 类名称 */
className?: string;
/** 组件自动获取焦点 */
autoFocus: boolean;
/** 是否选中(受控) */
checked: boolean;
/** 初始是否选中 */
defaultChecked: boolean;
/** 开关大小,可选值:default small */
size?: "small" | "default";
/** 是否禁用 */
disabled: boolean;
/** 选中时的内容 */
checkedChildren: React.ReactNode;
/** 非选中时的内容 */
unCheckedChildren: React.ReactNode;
/** 改变时触发 */
onChange: (checked: boolean, e: React.SyntheticEvent) => void;
onKeyDown: (e: React.KeyboardEvent) => void;
onClick: (checked: boolean, e: React.MouseEvent) => void;
}
export interface SwitchState {
checked: boolean;
}
export declare class Switch extends React.Component<SwitchProps, SwitchState> {
static defaultProps: {
prefixCls: string;
tabIndex: number;
defaultChecked: boolean;
};
static getDerivedStateFromProps(nextProps: SwitchProps, state: SwitchState): {
checked: boolean;
};
nodeRef: React.RefObject<HTMLDivElement>;
constructor(props: SwitchProps);
fireChange(checked: boolean, e: React.SyntheticEvent): void;
protected handleClick: (e: React.MouseEvent) => void;
protected handleKeyDown: (e: React.KeyboardEvent) => void;
componentDidMount(): void;
render(): JSX.Element;
}
export default Switch;
{
prefixCls: "rw-switch",
}
.rw-switch {
position: relative;
display: inline-block;
min-width: 44px;
height: 22px;
line-height: 22px;
vertical-align: middle;
border-radius: 20px 20px;
background-color: #bfcbd9;
cursor: pointer;
user-select: none;
transition: all 0.3s;
}
.rw-switch-checked {
background-color: #20a0ff;
}
.rw-switch-disabled {
cursor: not-allowed;
opacity: 0.4;
outline: none;
}
.rw-switch-small {
min-width: 28px;
height: 16px;
line-height: 16px;
}
.rw-switch-handler {
position: absolute;
width: 18px;
height: 18px;
left: 2px;
top: 2px;
transition: all 0.3s;
}
.rw-switch-handler:after {
position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;
border-radius: 50% 50%;
content: " ";
background: #fff;
}
.rw-switch-small .rw-switch-handler {
width: 12px;
height: 12px;
}
.rw-switch-checked .rw-switch-handler {
left: calc(100% - 18px - 2px);
}
.rw-switch-small.rw-switch-checked .rw-switch-handler {
left: calc(100% - 12px - 2px);
}
.rw-switch-inner {
color: #fff;
font-size: 12px;
display: block;
margin: 0 7px 0 25px;
transition: all 0.3s;
}
.rw-switch-checked .rw-switch-inner {
margin: 0 25px 0 7px;
}
.rw-switch-small .rw-switch-inner {
margin: 0 5px 0 18px;
}
.rw-switch-checked.rw-switch-small .rw-switch-inner {
margin: 0 18px 0 5px;
}