Commit 8ffc5e09 authored by Sendya's avatar Sendya

fix: mix menu

parent b9508ae9
...@@ -19,10 +19,10 @@ module.exports = { ...@@ -19,10 +19,10 @@ module.exports = {
'@typescript-eslint/no-inferrable-types': 0, '@typescript-eslint/no-inferrable-types': 0,
'@typescript-eslint/ban-ts-ignore': 'off', '@typescript-eslint/ban-ts-ignore': 'off',
'@typescript-eslint/no-var-requires': 'off', '@typescript-eslint/no-var-requires': 'off',
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/explicit-function-return-type': 'off', '@typescript-eslint/explicit-function-return-type': 'off',
'@typescript-eslint/no-empty-function': 'off', '@typescript-eslint/no-empty-function': 'off',
'@typescript-eslint/no-non-null-assertion': 'off', '@typescript-eslint/no-non-null-assertion': 'off',
'@typescript-eslint/no-unused-vars': ['error', { ignoreRestSiblings: true }],
'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off', 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
}, },
......
...@@ -17,13 +17,17 @@ const BasicLayout = defineComponent({ ...@@ -17,13 +17,17 @@ const BasicLayout = defineComponent({
openKeys: ['/dashboard'], openKeys: ['/dashboard'],
setOpenKeys: (keys: string[]) => (state.openKeys = keys), setOpenKeys: (keys: string[]) => (state.openKeys = keys),
selectedKeys: ['/welcome'], selectedKeys: ['/welcome'],
setSelectedKeys: (keys: string[]) => (state.selectedKeys = keys), setSelectedKeys: (keys: string[]) => {
console.log('keys', keys);
state.selectedKeys = keys;
},
isMobile: false, isMobile: false,
fixSiderbar: false, fixSiderbar: false,
fixedHeader: false, fixedHeader: false,
menuData: menus, menuData: menus,
sideWidth: 208, sideWidth: 208,
splitMenus: true,
hasSideMenu: true, hasSideMenu: true,
hasHeader: true, hasHeader: true,
hasFooterToolbar: false, hasFooterToolbar: false,
...@@ -52,9 +56,8 @@ const BasicLayout = defineComponent({ ...@@ -52,9 +56,8 @@ const BasicLayout = defineComponent({
<RouteContextProvider value={state}> <RouteContextProvider value={state}>
<ProLayout <ProLayout
v-model={[state.collapsed, 'collapsed']} v-model={[state.collapsed, 'collapsed']}
title={'Pro Layout'} layout={'mix'}
layout={'side'} navTheme={'light'}
navTheme={'dark'}
i18n={(key: string) => key} i18n={(key: string) => key}
isMobile={state.isMobile} isMobile={state.isMobile}
fixSiderbar={state.fixSiderbar} fixSiderbar={state.fixSiderbar}
...@@ -63,6 +66,7 @@ const BasicLayout = defineComponent({ ...@@ -63,6 +66,7 @@ const BasicLayout = defineComponent({
primaryColor={'#1890ff'} primaryColor={'#1890ff'}
contentStyle={{ minHeight: '300px' }} contentStyle={{ minHeight: '300px' }}
siderWidth={state.sideWidth} siderWidth={state.sideWidth}
splitMenus={state.splitMenus}
v-slots={{ v-slots={{
rightContentRender: () => ( rightContentRender: () => (
<div style="color: #FFF;margin-right: 16px;"> <div style="color: #FFF;margin-right: 16px;">
...@@ -72,7 +76,7 @@ const BasicLayout = defineComponent({ ...@@ -72,7 +76,7 @@ const BasicLayout = defineComponent({
menuHeaderRender: () => ( menuHeaderRender: () => (
<a> <a>
<img src="https://gw.alipayobjects.com/zos/antfincdn/PmY%24TNNDBI/logo.svg" /> <img src="https://gw.alipayobjects.com/zos/antfincdn/PmY%24TNNDBI/logo.svg" />
{state.collapsed ? null : <h1>Pro Layout</h1>} {state.collapsed ? null : <h1>Pro Preview</h1>}
</a> </a>
), ),
}} }}
......
{ {
"name": "@ant-design-vue/pro-layout", "name": "@ant-design-vue/pro-layout",
"version": "3.0.0-alpha.2", "version": "3.0.0-alpha.3",
"main": "./lib/index.js", "main": "./lib/index.js",
"module": "./es/index.js", "module": "./es/index.js",
"sideEffects": false, "sideEffects": false,
......
...@@ -111,6 +111,8 @@ const ProLayout: FunctionalComponent<BasicLayoutProps> = (props, { emit, slots, ...@@ -111,6 +111,8 @@ const ProLayout: FunctionalComponent<BasicLayoutProps> = (props, { emit, slots,
}; };
const rightContentRender = getComponentOrSlot(props, slots, 'rightContentRender') as any; const rightContentRender = getComponentOrSlot(props, slots, 'rightContentRender') as any;
const customHeaderRender = getComponentOrSlot(props, slots, 'headerRender'); const customHeaderRender = getComponentOrSlot(props, slots, 'headerRender');
const menuHeaderRenderFunc = props['menuHeaderRender'];
const menuHeaderRenderSlot = slots['menuHeaderRender'];
const headerDom = headerRender( const headerDom = headerRender(
{ {
...props, ...props,
...@@ -123,6 +125,8 @@ const ProLayout: FunctionalComponent<BasicLayoutProps> = (props, { emit, slots, ...@@ -123,6 +125,8 @@ const ProLayout: FunctionalComponent<BasicLayoutProps> = (props, { emit, slots,
// onOpenChange: handleOpenChange, // onOpenChange: handleOpenChange,
customHeaderRender, customHeaderRender,
rightContentRender, rightContentRender,
headerTitleRender:
menuHeaderRenderFunc || (menuHeaderRenderSlot && (() => menuHeaderRenderSlot())),
theme: (navTheme || 'dark').toLocaleLowerCase().includes('dark') ? 'dark' : 'light', theme: (navTheme || 'dark').toLocaleLowerCase().includes('dark') ? 'dark' : 'light',
}, },
matchMenuKeys, matchMenuKeys,
...@@ -131,8 +135,6 @@ const ProLayout: FunctionalComponent<BasicLayoutProps> = (props, { emit, slots, ...@@ -131,8 +135,6 @@ const ProLayout: FunctionalComponent<BasicLayoutProps> = (props, { emit, slots,
const footerRender = getComponentOrSlot(props, slots, 'footerRender'); const footerRender = getComponentOrSlot(props, slots, 'footerRender');
const menuRender = getComponentOrSlot(props, slots, 'menuRender'); const menuRender = getComponentOrSlot(props, slots, 'menuRender');
// const menuHeaderRender = getComponentOrSlot(props, slots, 'menuHeaderRender'); // const menuHeaderRender = getComponentOrSlot(props, slots, 'menuHeaderRender');
const menuHeaderRenderFunc = props['menuHeaderRender'];
const menuHeaderRenderSlot = slots['menuHeaderRender'];
return ( return (
<ProProvider i18n={defaultI18nRender}> <ProProvider i18n={defaultI18nRender}>
......
...@@ -4,8 +4,9 @@ import Layout from 'ant-design-vue/es/layout'; ...@@ -4,8 +4,9 @@ import Layout from 'ant-design-vue/es/layout';
import { GlobalHeader, GlobalHeaderProps } from './GlobalHeader'; import { GlobalHeader, GlobalHeaderProps } from './GlobalHeader';
import { TopNavHeader } from './TopNavHeader'; import { TopNavHeader } from './TopNavHeader';
import { useRouteContext } from './RouteContext';
import { RenderVNodeType, WithFalse } from './typings'; import { RenderVNodeType, WithFalse } from './typings';
import { clearMenuItem } from './utils'; import { flatMap } from './utils';
import './Header.less'; import './Header.less';
const { Header } = Layout; const { Header } = Layout;
...@@ -75,12 +76,13 @@ export const HeaderView = defineComponent({ ...@@ -75,12 +76,13 @@ export const HeaderView = defineComponent({
onCollapse, onCollapse,
} = toRefs(props); } = toRefs(props);
console.log('HeaderView', props); console.log('HeaderView', props);
const isTop = computed(() => props.layout === 'top'); const context = useRouteContext();
const isTop = computed(() => props.layout === 'top' || props.layout === 'mix');
const needFixedHeader = computed(() => fixedHeader.value || layout.value === 'mix'); const needFixedHeader = computed(() => fixedHeader.value || layout.value === 'mix');
const needSettingWidth = computed( const needSettingWidth = computed(
() => needFixedHeader.value && hasSiderMenu.value && !isTop.value && !isMobile.value, () => needFixedHeader.value && hasSiderMenu.value && !isTop.value && !isMobile.value,
); );
const clearMenuData = computed(() => clearMenuItem(props.menuData || [])); const clearMenuData = computed(() => (context.menuData && flatMap(context.menuData)) || []);
const className = computed(() => { const className = computed(() => {
return { return {
[`${prefixCls.value}-fixed-header`]: needFixedHeader.value, [`${prefixCls.value}-fixed-header`]: needFixedHeader.value,
...@@ -93,6 +95,7 @@ export const HeaderView = defineComponent({ ...@@ -93,6 +95,7 @@ export const HeaderView = defineComponent({
{headerContentRender && headerContentRender.value && headerContentRender.value(props)} {headerContentRender && headerContentRender.value && headerContentRender.value(props)}
</GlobalHeader> </GlobalHeader>
); );
console.log('renderContent', isTop.value, clearMenuData.value);
if (isTop.value && !isMobile.value) { if (isTop.value && !isMobile.value) {
defaultDom = ( defaultDom = (
<TopNavHeader <TopNavHeader
......
...@@ -8,8 +8,9 @@ import { WithFalse, RenderVNodeType } from '../typings'; ...@@ -8,8 +8,9 @@ import { WithFalse, RenderVNodeType } from '../typings';
import { SiderProps } from './typings'; import { SiderProps } from './typings';
import { MenuUnfoldOutlined, MenuFoldOutlined } from '@ant-design/icons-vue'; import { MenuUnfoldOutlined, MenuFoldOutlined } from '@ant-design/icons-vue';
import { useProProvider } from '../ProProvider'; import { useProProvider } from '../ProProvider';
import './index.less';
import { useRouteContext } from '../RouteContext'; import { useRouteContext } from '../RouteContext';
import { getMenuFirstChildren } from '../utils';
import './index.less';
const { Sider } = Layout; const { Sider } = Layout;
...@@ -116,14 +117,21 @@ const SiderMenu: FunctionalComponent<SiderMenuProps> = (props: SiderMenuProps) = ...@@ -116,14 +117,21 @@ const SiderMenu: FunctionalComponent<SiderMenuProps> = (props: SiderMenuProps) =
[`${baseClassName}-fixed`]: context.fixSiderbar, [`${baseClassName}-fixed`]: context.fixSiderbar,
}; };
}); });
const hasSide = computed(() => props.layout === 'mix' && context.splitMenus);
const flatMenuData = computed(
() => hasSide.value && getMenuFirstChildren(context.menuData, context.selectedKeys[0]),
);
// call menuHeaderRender // call menuHeaderRender
const headerDom = defaultRenderLogoAndTitle(props); const headerDom = defaultRenderLogoAndTitle(props);
const extraDom = menuExtraRender && menuExtraRender(props); const extraDom = menuExtraRender && menuExtraRender(props);
if (hasSide.value && flatMenuData.value.length === 0) {
return null;
}
const defaultMenuDom = ( const defaultMenuDom = (
<BaseMenu <BaseMenu
theme={navTheme === 'realDark' ? 'dark' : navTheme} theme={navTheme === 'realDark' ? 'dark' : navTheme}
mode="inline" mode="inline"
menuData={context.menuData} menuData={hasSide.value ? flatMenuData.value : context.menuData}
collapsed={props.collapsed} collapsed={props.collapsed}
openKeys={context.openKeys} openKeys={context.openKeys}
selectedKeys={context.selectedKeys} selectedKeys={context.selectedKeys}
......
...@@ -55,6 +55,7 @@ export const TopNavHeader: FunctionalComponent<TopNavHeaderProps> = props => { ...@@ -55,6 +55,7 @@ export const TopNavHeader: FunctionalComponent<TopNavHeaderProps> = props => {
contentWidth, contentWidth,
rightContentRender, rightContentRender,
layout, layout,
menuData,
} = props; } = props;
const context = useRouteContext(); const context = useRouteContext();
const prefixCls = `${propPrefixCls || 'ant-pro'}-top-nav-header`; const prefixCls = `${propPrefixCls || 'ant-pro'}-top-nav-header`;
...@@ -83,16 +84,16 @@ export const TopNavHeader: FunctionalComponent<TopNavHeaderProps> = props => { ...@@ -83,16 +84,16 @@ export const TopNavHeader: FunctionalComponent<TopNavHeaderProps> = props => {
theme={props.theme === 'realDark' ? 'dark' : props.theme} theme={props.theme === 'realDark' ? 'dark' : props.theme}
mode={props.mode} mode={props.mode}
collapsed={props.collapsed} collapsed={props.collapsed}
menuData={context.menuData} menuData={menuData}
openKeys={context.openKeys} openKeys={context.openKeys}
selectedKeys={context.selectedKeys} selectedKeys={context.selectedKeys}
class={{ 'top-nav-menu': props.mode === 'horizontal' }} class={{ 'top-nav-menu': props.mode === 'horizontal' }}
{...{ {...{
'onUpdate:openKeys': ($event: string[]) => { 'onUpdate:openKeys': ($event: string[]) => {
context.onOpenKeys($event); context.setOpenKeys($event);
}, },
'onUpdate:selectedKeys': ($event: any) => { 'onUpdate:selectedKeys': ($event: any) => {
context.onSelectedKeys($event); context.setSelectedKeys($event);
}, },
}} }}
/> />
......
...@@ -41,14 +41,31 @@ export function clearMenuItem(menusData: MenuDataItem[]): MenuDataItem[] { ...@@ -41,14 +41,31 @@ export function clearMenuItem(menusData: MenuDataItem[]): MenuDataItem[] {
children: clearMenuItem(finalItem.children), children: clearMenuItem(finalItem.children),
}; };
} }
// children 为空就直接删掉
delete finalItem.children; delete finalItem.children;
} }
console.log('finalItem', finalItem);
return finalItem; return finalItem;
}) })
.filter(item => item) as MenuDataItem[]; .filter(item => item) as MenuDataItem[];
} }
export function flatMap(menusData: MenuDataItem[]): MenuDataItem[] {
return menusData
.map(item => {
const finalItem = { ...item };
if (!finalItem.name || finalItem.meta?.hideInMenu) {
return null;
}
delete finalItem.children;
return finalItem;
})
.filter(item => item);
}
export function getMenuFirstChildren(menus: MenuDataItem[], key: string) {
return (menus[menus.findIndex(menu => menu.path === key)] || {}).children;
}
export const PropRenderType = { export const PropRenderType = {
type: [Function, Boolean], type: [Function, Boolean],
default: () => undefined, default: () => undefined,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment