import { Component } from 'react'; import { IBaseTabsProps } from '../../types'; import { NonUndefined } from 'utility-types'; abstract class BaseTabs< Id, InnerTab, TabPanelProps, TabsProps extends IBaseTabsProps > extends Component { abstract get tabsCls(): string; abstract getTabDataListFromTabs( tabs: NonUndefined ): InnerTab[]; abstract getTabDataListFromChildren( children: NonUndefined ): InnerTab[]; abstract renderNav(tabDataList: InnerTab[]): React.ReactNode; abstract renderTabPanel(tabDataList: InnerTab): React.ReactNode; /** * 带 TabPanel children 的渲染方式 */ renderWithPanel() { const { children } = this.props; const tabDataList = this.getTabDataListFromChildren( children as NonUndefined ); return (
{this.renderNav(tabDataList)}
{tabDataList.map(this.renderTabPanel.bind(this))}
); } /** * 使用 tabs props 的渲染方式 */ renderWithoutPanel() { const { tabs } = this.props; return (
{this.renderNav( this.getTabDataListFromTabs(tabs as NonUndefined) )}
); } render() { const { tabs, children } = this.props; if (!tabs && !children) { throw new Error( `Tabs Componment must receive one prop of 'tabs' and 'children'` ); } if (tabs) { return this.renderWithoutPanel(); } return this.renderWithPanel(); } } export default BaseTabs;