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
f9accd25
Commit
f9accd25
authored
Aug 12, 2021
by
Sendya
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix: menu selectedKeys abort
parent
17e764ca
Changes
6
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
74 additions
and
32 deletions
+74
-32
BasicLayout.vue
examples/layouts/BasicLayout.vue
+22
-3
BasicLayout.tsx
src/BasicLayout.tsx
+13
-5
BaseMenu.tsx
src/SiderMenu/BaseMenu.tsx
+18
-12
SiderMenu.tsx
src/SiderMenu/SiderMenu.tsx
+17
-10
index.ts
src/index.ts
+0
-2
index.ts
src/utils/index.ts
+4
-0
No files found.
examples/layouts/BasicLayout.vue
View file @
f9accd25
...
...
@@ -5,7 +5,6 @@
v-model:openKeys=
"baseState.openKeys"
v-bind=
"state"
:loading=
"loading"
:collapsed-button-render=
"false"
:breadcrumb=
"
{ routes: breadcrumb }"
>
<!-- only work layout `Side` -->
...
...
@@ -29,6 +28,23 @@
{{
route
.
breadcrumbName
}}
</router-link>
</
template
>
<!-- custom menu-item -->
<
template
#
menuItemRender=
"{ item, icon }"
>
<a-menu-item
:key=
"item.path"
:disabled=
"item.meta?.disabled"
:danger=
"item.meta?.danger"
:icon=
"icon"
>
<router-link
:to=
"
{ path: item.path }">
<div
class=
"a-menu-item-title"
>
<a-badge
count=
"5"
dot
>
{{
item
.
meta
.
title
}}
</a-badge>
</div>
</router-link>
</a-menu-item>
</
template
>
<!-- content begin -->
<router-view
/>
<!-- content end -->
...
...
@@ -61,7 +77,7 @@
<
script
lang=
"ts"
>
import
{
computed
,
defineComponent
,
reactive
,
ref
,
watchEffect
}
from
'vue'
;
import
{
useRouter
}
from
'vue-router'
;
import
{
Button
,
Switch
,
Select
,
Space
}
from
'ant-design-vue'
;
import
{
Button
,
Switch
,
Select
,
Space
,
Badge
,
Menu
}
from
'ant-design-vue'
;
import
{
getMenuData
,
clearMenuItem
,
FooterToolbar
}
from
'@ant-design-vue/pro-layout'
;
import
type
{
RouteContextProps
}
from
'@ant-design-vue/pro-layout'
;
...
...
@@ -76,6 +92,9 @@ export default defineComponent({
[
Select
.
name
]:
Select
,
[
Select
.
Option
.
displayName
!
]:
Select
.
Option
,
[
Space
.
name
]:
Space
,
[
Badge
.
name
]:
Badge
,
[
Menu
.
Item
.
name
]:
Menu
.
Item
,
},
setup
()
{
const
loading
=
ref
(
false
);
...
...
src/BasicLayout.tsx
View file @
f9accd25
import
{
computed
,
reactive
,
unref
,
provide
,
defineComponent
,
toRefs
,
watch
}
from
'vue'
;
import
{
computed
,
reactive
,
unref
,
provide
,
defineComponent
,
toRefs
}
from
'vue'
;
import
type
{
CSSProperties
,
PropType
,
ExtractPropTypes
}
from
'vue'
;
import
'ant-design-vue/es/layout/style'
;
...
...
@@ -14,12 +14,12 @@ import { default as SiderMenuWrapper, siderMenuProps } from './SiderMenu';
import
{
WrapContent
}
from
'./WrapContent'
;
import
globalHeaderProps
from
'./GlobalHeader/headerProps'
;
import
{
HeaderView
as
Header
,
headerViewProps
}
from
'./Header'
;
import
{
getPropsSlot
,
PropTypes
}
from
'./utils'
;
import
{
getPropsSlot
,
getPropsSlotfn
,
PropTypes
}
from
'./utils'
;
import
type
{
CustomRender
,
FormatMessage
,
WithFalse
}
from
'./typings'
;
import
'./BasicLayout.less'
;
import
PageLoading
from
'
@
/PageLoading'
;
import
PageLoading
from
'
.
/PageLoading'
;
export
const
basicLayoutProps
=
{
...
defaultSettingProps
,
...
...
@@ -172,13 +172,20 @@ const ProLayout = defineComponent({
const
customHeaderRender
=
getPropsSlot
(
slots
,
props
,
'headerRender'
);
const
menuHeaderRender
=
getPropsSlot
(
slots
,
props
,
'menuHeaderRender'
);
const
footerRender
=
getPropsSlot
(
slots
,
props
,
'footerRender'
);
// const menuRender = getPropsSlot(slots, props, 'menuRender');
const
breadcrumbRender
=
props
.
breadcrumbRender
||
slots
.
breadcrumbRender
;
const
breadcrumbRender
=
getPropsSlotfn
(
slots
,
props
,
'breadcrumbRender'
);
// menu render
const
menuItemRender
=
getPropsSlotfn
(
slots
,
props
,
'menuItemRender'
);
const
subMenuItemRender
=
getPropsSlotfn
(
slots
,
props
,
'subMenuItemRender'
);
const
menuRenders
=
{
menuItemRender
,
subMenuItemRender
,
};
const
headerDom
=
computed
(()
=>
headerRender
(
{
...
props
,
...
menuRenders
,
hasSiderMenu
:
!
isTop
.
value
,
menuData
:
props
.
menuData
,
isMobile
:
unref
(
isMobile
),
...
...
@@ -235,6 +242,7 @@ const ProLayout = defineComponent({
{
!
isTop
.
value
&&
(
<
SiderMenuWrapper
{
...
restProps
.
value
}
{
...
menuRenders
}
isMobile=
{
isMobile
.
value
}
menuHeaderRender=
{
menuHeaderRender
}
collapsedButtonRender=
{
collapsedButtonRender
}
...
...
src/SiderMenu/BaseMenu.tsx
View file @
f9accd25
...
...
@@ -8,6 +8,7 @@ import {
PropType
,
isVNode
,
ExtractPropTypes
,
ConcreteComponent
,
}
from
'vue'
;
import
{
createFromIconfontCN
}
from
'@ant-design/icons-vue'
;
import
'ant-design-vue/es/menu/style'
;
...
...
@@ -30,8 +31,12 @@ export function useRootSubmenuKeys(menus: MenuDataItem[]): ComputedRef<string[]>
}
export
interface
CustomMenuRender
{
menuItemRender
?:
WithFalse
<
(
item
:
MenuDataItem
)
=>
CustomRender
>
;
subMenuItemRender
?:
WithFalse
<
(
item
:
MenuDataItem
,
children
?:
CustomRender
[])
=>
CustomRender
>
;
menuItemRender
?:
WithFalse
<
(
args
:
{
item
:
MenuDataItem
;
title
?:
JSX
.
Element
;
icon
?:
JSX
.
Element
})
=>
CustomRender
>
;
subMenuItemRender
?:
WithFalse
<
(
args
:
{
item
:
MenuDataItem
;
children
?:
CustomRender
[]
})
=>
CustomRender
>
;
}
// vue props
...
...
@@ -130,9 +135,12 @@ LazyIcon.props = {
class
MenuUtil
{
props
:
BaseMenuProps
;
RouterLink
:
ConcreteComponent
;
constructor
(
props
:
BaseMenuProps
)
{
this
.
props
=
props
;
this
.
RouterLink
=
resolveComponent
(
'router-link'
)
as
ConcreteComponent
;
}
getNavMenuItems
=
(
menusData
:
MenuDataItem
[]
=
[])
=>
{
...
...
@@ -147,7 +155,10 @@ class MenuUtil {
!
item
?.
meta
?.
hideChildrenInMenu
)
{
if
(
this
.
props
.
subMenuItemRender
)
{
return
this
.
props
.
subMenuItemRender
(
item
,
this
.
getNavMenuItems
(
item
.
children
))
as
VNode
;
return
this
.
props
.
subMenuItemRender
({
item
,
children
:
this
.
getNavMenuItems
(
item
.
children
),
})
as
VNode
;
}
const
{
prefixCls
,
locale
}
=
this
.
props
;
const
menuTitle
=
(
locale
&&
locale
(
item
.
meta
?.
title
))
||
item
.
meta
?.
title
;
...
...
@@ -176,7 +187,8 @@ class MenuUtil {
const
[
title
,
icon
]
=
this
.
getMenuItem
(
item
);
return
(
((
this
.
props
.
menuItemRender
&&
this
.
props
.
menuItemRender
(
item
))
as
VNode
)
||
(
((
this
.
props
.
menuItemRender
&&
this
.
props
.
menuItemRender
({
item
,
title
,
icon
}))
as
VNode
)
||
(
<
Menu
.
Item
disabled=
{
item
.
meta
?.
disabled
}
danger=
{
item
.
meta
?.
danger
}
...
...
@@ -193,7 +205,7 @@ class MenuUtil {
const
meta
=
{
...
item
.
meta
};
const
target
=
(
meta
.
target
||
null
)
as
string
|
null
;
const
hasUrl
=
isUrl
(
item
.
path
);
const
CustomTag
:
any
=
(
target
&&
'a'
)
||
resolveComponent
(
'router-link'
)
;
const
CustomTag
:
any
=
(
target
&&
'a'
)
||
this
.
RouterLink
;
const
props
=
{
to
:
{
name
:
item
.
name
}
};
const
attrs
=
hasUrl
||
target
?
{
...
item
.
meta
,
href
:
item
.
path
,
target
}
:
{};
...
...
@@ -209,13 +221,7 @@ class MenuUtil {
</
CustomTag
>
);
const
icon
=
(
item
.
meta
?.
icon
&&
(
<
CustomTag
{
...
attrs
}
{
...
props
}
class=
{
`${prefixCls}-menu-item`
}
>
<
LazyIcon
icon=
{
item
.
meta
.
icon
}
/>
</
CustomTag
>
))
||
null
;
const
icon
=
(
item
.
meta
?.
icon
&&
<
LazyIcon
icon=
{
item
.
meta
.
icon
}
/>)
||
undefined
;
return
[
defaultTitle
,
icon
];
};
...
...
src/SiderMenu/SiderMenu.tsx
View file @
f9accd25
...
...
@@ -4,6 +4,7 @@ import {
ExtractPropTypes
,
PropType
,
CSSProperties
,
unref
,
}
from
'vue'
;
import
'ant-design-vue/es/layout/style'
;
import
Layout
from
'ant-design-vue/es/layout'
;
...
...
@@ -161,8 +162,9 @@ const SiderMenu: FC<SiderMenuProps> = (props: SiderMenuProps) => {
const
context
=
useRouteContext
();
const
{
getPrefixCls
}
=
context
;
const
baseClassName
=
getPrefixCls
(
'sider'
);
// const isMix = computed(() => props.layout === 'mix');
// const fixed = computed(() => context.fixSiderbar);
const
hasSplitMenu
=
computed
(()
=>
props
.
layout
===
'mix'
&&
props
.
splitMenus
);
const
hasSide
=
computed
(()
=>
props
.
layout
===
'mix'
||
props
.
layout
===
'side'
||
false
);
const
sTheme
=
computed
(()
=>
(
props
.
layout
===
'mix'
&&
'light'
)
||
props
.
navTheme
);
const
sSideWidth
=
computed
(()
=>
(
props
.
collapsed
?
props
.
collapsedWidth
:
props
.
siderWidth
));
const
classNames
=
computed
(()
=>
{
...
...
@@ -173,13 +175,18 @@ const SiderMenu: FC<SiderMenuProps> = (props: SiderMenuProps) => {
[
`
${
baseClassName
}
-fixed`
]:
context
.
fixSiderbar
,
};
});
const
hasSide
=
computed
(
()
=>
(
(
props
.
layout
===
'mix'
||
props
.
layout
===
'side'
)
&&
props
.
splitMenus
)
||
false
,
const
flatMenuData
=
computed
(
()
=>
(
hasSide
.
value
&&
getMenuFirstChildren
(
context
.
menuData
,
context
.
selectedKeys
[
0
]))
||
[]
,
);
const
flatMenuData
=
computed
(()
=>
{
console
.
log
(
'context.selectedKeys[0]'
,
context
.
selectedKeys
[
0
]);
return
(
hasSide
.
value
&&
getMenuFirstChildren
(
context
.
menuData
,
context
.
selectedKeys
[
0
]))
||
[];
});
const
handleSelect
=
(
$event
:
string
[])
=>
{
if
(
props
.
onSelect
)
{
if
(
unref
(
hasSplitMenu
))
{
props
.
onSelect
([
context
.
selectedKeys
[
0
],
...
$event
]);
return
;
}
props
.
onSelect
(
$event
);
}
};
// call menuHeaderRender
const
headerDom
=
defaultRenderLogoAndTitle
(
props
);
const
extraDom
=
menuExtraRender
&&
menuExtraRender
(
props
);
...
...
@@ -192,7 +199,7 @@ const SiderMenu: FC<SiderMenuProps> = (props: SiderMenuProps) => {
locale=
{
props
.
locale
||
context
.
locale
}
theme=
{
sTheme
.
value
===
'realDark'
?
'dark'
:
sTheme
.
value
}
mode=
"inline"
menuData=
{
hasS
ide
.
value
?
flatMenuData
.
value
:
context
.
menuData
}
menuData=
{
hasS
plitMenu
.
value
?
flatMenuData
.
value
:
context
.
menuData
}
collapsed=
{
props
.
collapsed
}
openKeys=
{
context
.
openKeys
}
selectedKeys=
{
context
.
selectedKeys
}
...
...
@@ -205,7 +212,7 @@ const SiderMenu: FC<SiderMenuProps> = (props: SiderMenuProps) => {
class=
{
`${baseClassName}-menu`
}
{
...
{
'
onUpdate
:
openKeys
':
(
$event
:
string
[])
=
>
onOpenKeys
&&
onOpenKeys($event),
'onUpdate:selectedKeys':
($event: string[]) =
>
onSelect
&&
onSelect($event)
,
'onUpdate:selectedKeys':
handleSelect
,
}}
/
>
);
...
...
src/index.ts
View file @
f9accd25
...
...
@@ -27,5 +27,3 @@ export type { WaterMarkProps } from './WaterMark';
export
{
default
}
from
'./BasicLayout'
;
// export { default as ProLayout } from './BasicLayout';
export
type
{
BasicLayoutProps
}
from
'./BasicLayout'
;
export
{
default
as
PageLoading
}
from
'./Pageloading'
;
src/utils/index.ts
View file @
f9accd25
...
...
@@ -71,6 +71,10 @@ export function getPropsSlot(slots: Slots, props: Record<string, any>, prop = 'd
return
props
[
prop
]
||
slots
[
prop
]?.();
}
export
function
getPropsSlotfn
(
slots
:
Slots
,
props
:
Record
<
string
,
any
>
,
prop
=
'default'
)
{
return
props
[
prop
]
||
slots
[
prop
];
}
export
const
PropRenderType
=
{
type
:
[
Function
,
Boolean
],
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