增加Switch组件。

This commit is contained in:
徐涛
2024-12-28 07:59:04 +08:00
parent 0b9903f4f3
commit 2491fe162f
2 changed files with 82 additions and 0 deletions

34
src/components/Switch.tsx Normal file
View File

@@ -0,0 +1,34 @@
import cx from 'clsx';
import { isEqual } from 'lodash-es';
import { useCallback, useEffect, useState } from 'react';
import styles from './Switch.module.css';
type SwitchProps = {
checked?: boolean;
disabled?: boolean;
onChange?: (checked: boolean) => void;
};
export function Switch({ checked = false, disabled = false, onChange }: SwitchProps) {
const [isChecked, setIsChecked] = useState(checked);
const handleSwitch = useCallback(() => {
if (!disabled) {
setIsChecked((prev) => !prev);
onChange?.(!isChecked);
}
}, [onChange, disabled]);
useEffect(() => {
if (!isEqual(checked, isChecked)) {
setIsChecked(checked);
}
}, [checked]);
return (
<div className={styles.switch} aria-disabled={disabled}>
<div
className={cx(styles.switch_handle, isChecked && styles.checked)}
onClick={handleSwitch}></div>
</div>
);
}