import './index.less' import { useDebounceFn } from '@vueuse/core' import { default as ResizeObserver } from 'ant-design-vue/es/vc-resize-observer' import type { SiderMenuProps } from '../SiderMenu/SiderMenu' import type { GlobalHeaderProps } from '../GlobalHeader' import type { CSSProperties, FunctionalComponent } from 'vue' import type { HeaderViewProps } from '../../Header' import { defaultRenderLogoAndTitle } from '../SiderMenu/SiderMenu' import { ref } from 'vue' import BaseMenu from '../SiderMenu/BaseMenu' import { getRender } from '#/layout/utils' import type { RightContentRender } from '#/layout/renderTypes' export type TopNavHeaderProps = SiderMenuProps & GlobalHeaderProps /** * 抽离出来是为了防止 rightSize 经常改变导致菜单 render * * @param param0 * @param props */ export const RightContent: FunctionalComponent = props => { const rightSize = ref('auto') /** 减少一下渲染的次数 */ const setRightSizeDebounceFn = useDebounceFn((width: number) => { rightSize.value = `${width}px` }, 160) return (
{ setRightSizeDebounceFn(width) }} > {props.rightContentRender && (
{props.rightContentRender({ ...props } as HeaderViewProps)}
)}
) } export const TopNavHeader: FunctionalComponent = (props, { slots, attrs }) => { const prefixCls = `${props.prefixCls || 'ant-pro'}-top-nav-header` const headerDom = defaultRenderLogoAndTitle( { ...props, collapsed: false }, slots, props.layout === 'mix' ? 'headerTitleRender' : undefined ) const className = computed(() => [prefixCls, attrs.class, { light: props.theme === 'light' }]) // @ts-ignore const defaultDom = const headerContentDom = props.headerContentRender ? props.headerContentRender?.(props as HeaderViewProps, defaultDom) : defaultDom const rightContentRender = getRender(props, slots, 'rightContentRender') return (
{headerContentDom}
{rightContentRender && ( )}
) } export default TopNavHeader