增加禁用标签页功能。

This commit is contained in:
徐涛 2025-02-17 09:44:01 +08:00
parent 4b56d3a625
commit e980eeec3d
2 changed files with 28 additions and 10 deletions

View File

@ -18,5 +18,9 @@
&:hover { &:hover {
color: var(--color-primary-hover); color: var(--color-primary-hover);
} }
&.disabled {
color: var(--color-primary-disabled);
cursor: not-allowed;
}
} }
} }

View File

@ -3,20 +3,30 @@ import { isEqual, isNil } from 'lodash-es';
import { useCallback, useEffect, useState } from 'react'; import { useCallback, useEffect, useState } from 'react';
import styles from './Tab.module.css'; import styles from './Tab.module.css';
type TabProps = { type TabOption = {
tabs: { title: string; id: unknown }[]; title: string;
activeTab?: unknown; id: unknown;
onActive?: (id: unknown) => void;
}; };
export function Tab({ tabs = [], activeTab, onActive }: TabProps) { type TabProps = {
tabs: TabOption[];
activeTab?: unknown;
onActive?: (id: TabOption['id']) => void;
disabled?: { [d: keyof TabOption['id']]: boolean };
};
export function Tab({ tabs = [], activeTab, onActive, disabled }: TabProps) {
const [active, setActive] = useState(() => const [active, setActive] = useState(() =>
isNil(activeTab) ? 0 : tabs.findIndex((tab) => isEqual(tab.id, activeTab)), isNil(activeTab) ? 0 : tabs.findIndex((tab) => isEqual(tab.id, activeTab)),
); );
const handleActivate = useCallback((index: number) => { const handleActivate = useCallback(
(index: number) => {
if (disabled?.[tabs[index].id] ?? false) return;
setActive(index); setActive(index);
onActive?.(tabs[index].id); onActive?.(tabs[index].id);
}, []); },
[tabs, onActive, disabled],
);
useEffect(() => { useEffect(() => {
const activeIndex = tabs.findIndex((tab) => isEqual(tab.id, activeTab)); const activeIndex = tabs.findIndex((tab) => isEqual(tab.id, activeTab));
@ -30,7 +40,11 @@ export function Tab({ tabs = [], activeTab, onActive }: TabProps) {
{tabs.map((tab, index) => ( {tabs.map((tab, index) => (
<div <div
key={`tab_${index}_${tab.id}`} key={`tab_${index}_${tab.id}`}
className={cx(styles.tab, isEqual(index, active) && styles.actived)} className={cx(
styles.tab,
isEqual(index, active) && styles.actived,
(disabled?.[tab.id] ?? false) && styles.disabled,
)}
onClick={() => handleActivate(index)}> onClick={() => handleActivate(index)}>
{tab.title} {tab.title}
</div> </div>