import './index.less' import PropTypes from 'ant-design-vue/es/_util/vue-types' import GridContent from '../GridContent' import { PageHeader, Tabs } from 'ant-design-vue' import { getComponentFromProp } from 'ant-design-vue/lib/_util/props-util' const { PageHeaderProps } = PageHeader const prefixedClassName = 'ant-pro-page-header-wrap' const PageHeaderTabConfig = { tabList: PropTypes.array, tabActiveKey: PropTypes.string, tabProps: PropTypes.object, tabChange: PropTypes.func } const PageHeaderWrapperProps = { ...PageHeaderTabConfig, ...PageHeaderProps, title: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]), content: PropTypes.any, extraContent: PropTypes.any, pageHeaderRender: PropTypes.func, breadcrumb: PropTypes.oneOfType([PropTypes.object, PropTypes.bool]).def(true), back: PropTypes.func, // only use `pro-layout` in children i18nRender: PropTypes.oneOfType([PropTypes.func, PropTypes.bool]).def(false) } const defaultI18nRender = (t) => t const useContext = (route) => { return route && { ...route.meta } || null } const noop = () => { } // TODO :: tabList tab 支持图标 优化 const renderFooter = (h, tabConfigProps, i18nRender) => { const { tabList, tabActiveKey, tabChange: onTabChange, tabBarExtraContent, tabProps } = tabConfigProps return tabList && tabList.length > 0 && ( { if (onTabChange) { onTabChange(key) } }} tabBarExtraContent={tabBarExtraContent} {...tabProps} > {tabList.map(item => ( ))} ) } const renderPageHeader = (h, content, extraContent) => { if (!content && !extraContent) { return null } return (
{content && (
{content}
)} {extraContent && (
{extraContent}
)}
) } const defaultPageHeaderRender = (h, props, pageMeta, i18nRender) => { const { title, content, pageHeaderRender, extra, extraContent, breadcrumb, back: handleBack, ...restProps } = props if (pageHeaderRender) { return pageHeaderRender({ ...props }) } let pageHeaderTitle = title if (!title && title !== false) { pageHeaderTitle = pageMeta.title } const tabProps = { breadcrumb, extra, title: i18nRender(pageHeaderTitle), footer: renderFooter(h, restProps, i18nRender) } if (!handleBack) { tabProps.backIcon = false } return ( {renderPageHeader(h, content, extraContent)} ) // return } const PageHeaderWrapper = { name: 'PageHeaderWrapper', props: PageHeaderWrapperProps, inject: ['locale', 'contentWidth', 'breadcrumbRender'], render (h) { const { $route, $listeners } = this const children = this.$slots.default const content = getComponentFromProp(this, 'content') const extra = getComponentFromProp(this, 'extra') const extraContent = getComponentFromProp(this, 'extraContent') const pageMeta = useContext(this.$props.route || $route) const i18n = this.$props.i18nRender || this.locale || defaultI18nRender const contentWidth = this.$props.contentWidth || this.contentWidth || false // 当未设置 back props 或未监听 @back,不显示 back // props 的 back 事件优先级高于 @back,需要注意 const onBack = this.$props.back || $listeners.back const back = onBack && (() => { // this.$emit('back') // call props back func onBack && onBack() }) || undefined const onTabChange = this.$props.tabChange const tabChange = (key) => { this.$emit('tabChange', key) onTabChange && onTabChange(key) } let breadcrumb = {} const propsBreadcrumb = this.$props.breadcrumb if (propsBreadcrumb === true) { const routes = $route.matched.concat().map(route => { return { path: route.path, breadcrumbName: i18n(route.meta.title) } }) const defaultItemRender = ({ route, params, routes, paths, h }) => { return routes.indexOf(route) === routes.length - 1 && ( {route.breadcrumbName} ) || ( {route.breadcrumbName} ) } // If custom breadcrumb render undefined // use default breadcrumb.. const itemRender = this.breadcrumbRender || defaultItemRender breadcrumb = { props: { routes, itemRender } } } else { breadcrumb = propsBreadcrumb || null } const props = { ...this.$props, content, extra, extraContent, breadcrumb, tabChange, back } return (
{defaultPageHeaderRender(h, props, pageMeta, i18n)}
{children ? (
{children}
) : null}
) } } export default PageHeaderWrapper