Tab增加被动切换标签页的功能。

This commit is contained in:
徐涛 2025-02-06 16:41:12 +08:00
parent 32d8457802
commit 0350380df6

View File

@ -1,20 +1,30 @@
import cx from 'clsx'; import cx from 'clsx';
import { isEqual } from 'lodash-es'; import { isEqual, isNil } from 'lodash-es';
import { useCallback, useState } from 'react'; import { useCallback, useEffect, useState } from 'react';
import styles from './Tab.module.css'; import styles from './Tab.module.css';
type TabProps = { type TabProps = {
tabs: { title: string; id: unknown }[]; tabs: { title: string; id: unknown }[];
activeTab?: unknown;
onActive?: (id: unknown) => void; onActive?: (id: unknown) => void;
}; };
export function Tab({ tabs = [], onActive }: TabProps) { export function Tab({ tabs = [], activeTab, onActive }: TabProps) {
const [active, setActive] = useState(0); const [active, setActive] = useState(() =>
isNil(activeTab) ? 0 : tabs.findIndex((tab) => isEqual(tab.id, activeTab)),
);
const handleActivate = useCallback((index: number) => { const handleActivate = useCallback((index: number) => {
setActive(index); setActive(index);
onActive?.(tabs[index].id); onActive?.(tabs[index].id);
}, []); }, []);
useEffect(() => {
const activeIndex = tabs.findIndex((tab) => isEqual(tab.id, activeTab));
if (!isNil(activeIndex) && !isEqual(activeIndex, -1) && !isEqual(activeIndex, active)) {
setActive(activeIndex);
}
}, [activeTab]);
return ( return (
<div className={styles.tabs_container}> <div className={styles.tabs_container}>
{tabs.map((tab, index) => ( {tabs.map((tab, index) => (