import { ArrowDownOutlined, MenuOutlined } from '@ant-design/icons'; import { Anchor, Collapse, ConfigProvider } from 'antd'; import { useResponsive, useTheme } from 'antd-style'; import { memo, useMemo, type FC } from 'react'; import useControlledState from 'use-merge-value'; import { AnchorItem } from '../../types'; import { useStyles } from './style'; /** * @title 目录组件属性 */ export interface TocProps { /** * @title 目录项列表 */ items: AnchorItem[]; /** * @title 当前激活的目录项 key 值 */ activeKey?: string; /** * @title 目录项切换的回调函数 * @param activeKey - 切换后的目录项 key 值 */ onChange?: (activeKey: string) => void; } const Toc: FC = memo(({ items, activeKey, onChange }) => { const [activeLink, setActiveLink] = useControlledState('', { value: activeKey, onChange, }); const { styles } = useStyles(); const { mobile } = useResponsive(); const theme = useTheme(); const activeAnchor = items.find((item) => item.id === activeLink); const linkItems = useMemo( () => items.map((item) => ({ href: `#${item.id}`, title: item.title, key: item.id, children: item.children?.map((child) => ({ href: `#${child.id}`, title: child?.title, key: child.id, })), })), [items], ); return ( (items?.length === 0 ? null : mobile ? (
(isActive ? : )} className={styles.expand} > { setActiveLink(currentLink.replace('#', '')); }} targetOffset={theme.headerHeight + 12} items={linkItems} />
) : (

Table of Contents

)) || null ); }); export default Toc;