import classNames from 'classnames'; import * as React from 'react'; import type { ConfigConsumerProps } from '../config-provider'; import { ConfigConsumer } from '../config-provider'; import type { AntAnchor } from './Anchor'; import AnchorContext from './context'; export interface AnchorLinkProps { prefixCls?: string; href: string; target?: string; title: React.ReactNode; children?: React.ReactNode; className?: string; } class AnchorLink extends React.Component { static defaultProps = { href: '#', }; static contextType = AnchorContext; context: AntAnchor; componentDidMount() { this.context.registerLink(this.props.href); } componentDidUpdate({ href: prevHref }: AnchorLinkProps) { const { href } = this.props; if (prevHref !== href) { this.context.unregisterLink(prevHref); this.context.registerLink(href); } } componentWillUnmount() { this.context.unregisterLink(this.props.href); } handleClick = (e: React.MouseEvent) => { const { scrollTo, onClick } = this.context; const { href, title } = this.props; onClick?.(e, { title, href }); scrollTo(href); }; renderAnchorLink = ({ getPrefixCls }: ConfigConsumerProps) => { const { prefixCls: customizePrefixCls, href, title, children, className, target } = this.props; const prefixCls = getPrefixCls('anchor', customizePrefixCls); const active = this.context.activeLink === href; const wrapperClassName = classNames( `${prefixCls}-link`, { [`${prefixCls}-link-active`]: active, }, className, ); const titleClassName = classNames(`${prefixCls}-link-title`, { [`${prefixCls}-link-title-active`]: active, }); return (
{title} {children}
); }; render() { return {this.renderAnchorLink}; } } export default AnchorLink;