Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
P
pro-layout
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
packages
pro-layout
Commits
8ffc5e09
Commit
8ffc5e09
authored
Jan 07, 2021
by
Sendya
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix: mix menu
parent
b9508ae9
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
53 additions
and
18 deletions
+53
-18
.eslintrc.js
.eslintrc.js
+1
-1
index.tsx
examples/index.tsx
+9
-5
package.json
package.json
+1
-1
BasicLayout.tsx
src/BasicLayout.tsx
+4
-2
Header.tsx
src/Header.tsx
+6
-3
SiderMenu.tsx
src/SiderMenu/SiderMenu.tsx
+10
-2
index.tsx
src/TopNavHeader/index.tsx
+4
-3
index.ts
src/utils/index.ts
+18
-1
No files found.
.eslintrc.js
View file @
8ffc5e09
...
@@ -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'
,
},
},
...
...
examples/index.tsx
View file @
8ffc5e09
...
@@ -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
>
),
),
}
}
}
}
...
...
package.json
View file @
8ffc5e09
{
{
"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
,
...
...
src/BasicLayout.tsx
View file @
8ffc5e09
...
@@ -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
}
>
...
...
src/Header.tsx
View file @
8ffc5e09
...
@@ -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
...
...
src/SiderMenu/SiderMenu.tsx
View file @
8ffc5e09
...
@@ -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
}
...
...
src/TopNavHeader/index.tsx
View file @
8ffc5e09
...
@@ -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
.
on
OpenKeys
(
$event
);
context
.
set
OpenKeys
(
$event
);
}
,
}
,
'onUpdate:selectedKeys': ($event: any) =
>
{
'onUpdate:selectedKeys': ($event: any) =
>
{
context
.
on
SelectedKeys
(
$event
);
context
.
set
SelectedKeys
(
$event
);
}
,
}
,
}}
}}
/
>
/
>
...
...
src/utils/index.ts
View file @
8ffc5e09
...
@@ -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
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment