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
9afdc589
Commit
9afdc589
authored
Feb 03, 2021
by
Sendya
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix: menu selectedKeys
parent
44bb2288
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
77 additions
and
39 deletions
+77
-39
welcome.tsx
examples/demo/welcome.tsx
+9
-6
index.tsx
examples/index.tsx
+14
-2
state.ts
examples/state.ts
+3
-4
BasicLayout.tsx
src/BasicLayout.tsx
+2
-1
Header.tsx
src/Header.tsx
+31
-24
BaseMenu.tsx
src/SiderMenu/BaseMenu.tsx
+17
-1
index.tsx
src/TopNavHeader/index.tsx
+1
-0
index.ts
src/utils/index.ts
+0
-1
No files found.
examples/demo/welcome.tsx
View file @
9afdc589
...
...
@@ -42,13 +42,16 @@ export default defineComponent({
state
.
fixSiderbar
=
!
state
.
fixSiderbar
;
}
}
/>
<
Switch
checkedChildren=
"Split Menus"
unCheckedChildren=
"Un Split Menus"
checked=
{
state
.
splitMenus
}
onChange=
{
()
=>
{
state
.
splitMenus
=
!
state
.
splitMenus
;
}
}
/>
</
Space
>
<
p
>
<
p
>
block
</
p
>
...
<
br
/>
long text..
</
p
>
<
pre
>
{
JSON
.
stringify
(
state
,
null
,
2
)
}
</
pre
>
<
p
>
<
p
>
block
</
p
>
...
...
...
examples/index.tsx
View file @
9afdc589
import
'ant-design-vue/dist/antd.less'
;
import
{
createApp
,
defineComponent
,
watch
,
ref
}
from
'vue'
;
import
{
createRouter
,
createWebHashHistory
,
useRoute
}
from
'vue-router'
;
import
{
createRouter
,
createWebHashHistory
,
useRoute
,
useRouter
,
RouteRecord
}
from
'vue-router'
;
import
{
Avatar
}
from
'ant-design-vue'
;
import
{
UserOutlined
}
from
'@ant-design/icons-vue'
;
import
{
default
as
ProLayout
}
from
'../src/'
;
import
{
createRouteContext
}
from
'../src/RouteContext'
;
import
{
globalState
as
state
}
from
'./state'
;
import
{
globalState
,
globalState
as
state
}
from
'./state'
;
import
registerIcons
from
'./_util/icons'
;
...
...
@@ -14,13 +14,22 @@ import Page1 from './demo/page1';
import
Welcome
from
'./demo/welcome'
;
import
FormPage
from
'./demo/form'
;
const
getMenuData
=
(
routes
:
RouteRecord
[])
=>
{
const
childrenRoute
=
routes
.
find
(
route
=>
route
.
path
===
'/'
);
return
childrenRoute
?.
children
||
[];
};
const
BasicLayout
=
defineComponent
({
name
:
'BasicLayout'
,
inheritAttrs
:
false
,
setup
()
{
const
{
getRoutes
}
=
useRouter
();
const
route
=
useRoute
();
const
[
RouteContextProvider
]
=
createRouteContext
();
const
menuData
=
getMenuData
(
getRoutes
());
globalState
.
menuData
=
menuData
;
const
cacheOpenKeys
=
ref
<
string
[]
>
([]);
watch
(
()
=>
state
.
collapsed
,
...
...
@@ -112,6 +121,7 @@ const routes = [
path
:
'/dashboard'
,
name
:
'dashboard'
,
meta
:
{
title
:
'dashboard'
},
redirect
:
'/dashboard/analysis'
,
component
:
RouteView
,
children
:
[
{
...
...
@@ -138,6 +148,7 @@ const routes = [
path
:
'/form'
,
name
:
'form'
,
meta
:
{
title
:
'Form'
,
icon
:
'SmileOutlined'
},
redirect
:
'/form/basic-form'
,
component
:
RouteView
,
children
:
[
{
...
...
@@ -168,6 +179,7 @@ const router = createRouter({
path
:
'/'
,
name
:
'index'
,
meta
:
{
title
:
''
},
redirect
:
'/welcome'
,
component
:
BasicLayout
,
children
:
routes
,
},
...
...
examples/state.ts
View file @
9afdc589
import
{
reactive
}
from
'vue'
;
import
{
menus
}
from
'./menus'
;
import
{
RouteContextProps
}
from
'../src/RouteContext'
;
export
const
globalState
=
reactive
<
RouteContextProps
>
({
...
...
@@ -12,10 +11,10 @@ export const globalState = reactive<RouteContextProps>({
isMobile
:
false
,
fixSiderbar
:
false
,
fixedHeader
:
false
,
menuData
:
menus
,
menuData
:
[]
,
sideWidth
:
208
,
splitMenus
:
tru
e
,
hasSideMenu
:
tru
e
,
splitMenus
:
fals
e
,
hasSideMenu
:
fals
e
,
hasHeader
:
true
,
hasFooterToolbar
:
false
,
setHasFooterToolbar
:
(
has
:
boolean
)
=>
(
globalState
.
hasFooterToolbar
=
has
),
...
...
src/BasicLayout.tsx
View file @
9afdc589
...
...
@@ -72,7 +72,7 @@ const ProLayout: FunctionalComponent<BasicLayoutProps> = (props, { emit, slots }
emit
(
'update:collapsed'
,
collapsed
);
};
const
handleOpenKeys
=
(
openKeys
:
string
[]
|
false
):
void
=>
{
openKeys
&&
emit
(
'update:open-keys'
,
openKeys
);
emit
(
'update:open-keys'
,
openKeys
);
};
const
handleSelect
=
(
selectedKeys
:
string
[]
|
false
):
void
=>
{
selectedKeys
&&
emit
(
'update:selected-keys'
,
selectedKeys
);
...
...
@@ -239,6 +239,7 @@ ProLayout.props = {
// settings
/* 侧边菜单宽度 */
siderWidth
:
PropTypes
.
number
.
def
(
208
),
splitMenus
:
PropTypes
.
bool
,
/* 控制菜单的收起和展开 */
collapsed
:
PropTypes
.
bool
,
/* 菜单的折叠收起事件 (collapsed: boolean) => void */
...
...
src/Header.tsx
View file @
9afdc589
...
...
@@ -6,7 +6,7 @@ import { GlobalHeader, GlobalHeaderProps } from './GlobalHeader';
import
{
TopNavHeader
}
from
'./TopNavHeader'
;
import
{
useRouteContext
}
from
'./RouteContext'
;
import
{
RenderVNodeType
,
WithFalse
}
from
'./typings'
;
import
{
flatMap
}
from
'./utils'
;
import
{
clearMenuItem
,
flatMap
}
from
'./utils'
;
import
'./Header.less'
;
const
{
Header
}
=
Layout
;
...
...
@@ -56,6 +56,7 @@ export const headerProps = [
'navTheme'
,
'onSelect'
,
'onOpenChange'
,
'onOpenKeys'
,
];
export
const
HeaderView
=
defineComponent
({
...
...
@@ -76,12 +77,16 @@ export const HeaderView = defineComponent({
onCollapse
,
}
=
toRefs
(
props
);
const
context
=
useRouteContext
();
const
isTop
=
computed
(()
=>
props
.
layout
===
'top'
||
props
.
layout
===
'mix'
);
const
needFixedHeader
=
computed
(()
=>
fixedHeader
.
value
||
layout
.
value
===
'mix'
);
const
isTop
=
computed
(()
=>
layout
.
value
===
'top'
);
const
needSettingWidth
=
computed
(
()
=>
needFixedHeader
.
value
&&
hasSiderMenu
.
value
&&
!
isTop
.
value
&&
!
isMobile
.
value
,
);
const
clearMenuData
=
computed
(()
=>
(
context
.
menuData
&&
flatMap
(
context
.
menuData
))
||
[]);
// cache menu
const
clearMenuData
=
computed
(
()
=>
(
context
.
menuData
&&
clearMenuItem
(
context
.
menuData
))
||
[],
);
const
className
=
computed
(()
=>
{
return
{
[
`
${
prefixCls
.
value
}
-fixed-header`
]:
needFixedHeader
.
value
,
...
...
@@ -120,32 +125,34 @@ export const HeaderView = defineComponent({
:
'100%'
;
});
const
right
=
computed
(()
=>
(
needFixedHeader
.
value
?
0
:
undefined
));
return
()
=>
(
<>
{
needFixedHeader
.
value
&&
(
return
()
=>
{
return
(
<>
{
needFixedHeader
.
value
&&
(
<
Header
style=
{
{
height
:
`${headerHeight.value}px`
,
lineHeight
:
`${headerHeight.value}px`
,
background
:
'transparent'
,
}
}
/>
)
}
<
Header
style=
{
{
padding
:
0
,
height
:
`${headerHeight.value}px`
,
lineHeight
:
`${headerHeight.value}px`
,
background
:
'transparent'
,
width
:
width
.
value
,
zIndex
:
layout
.
value
===
'mix'
?
100
:
19
,
right
:
right
.
value
,
}
}
/>
)
}
<
Header
style=
{
{
padding
:
0
,
height
:
`${headerHeight.value}px`
,
lineHeight
:
`${headerHeight.value}px`
,
width
:
width
.
value
,
zIndex
:
layout
.
value
===
'mix'
?
100
:
19
,
right
:
right
.
value
,
}
}
class=
{
className
.
value
}
>
{
renderContent
()
}
</
Header
>
</>
);
class=
{
className
.
value
}
>
{
renderContent
()
}
</
Header
>
</>
);
};
},
});
...
...
src/SiderMenu/BaseMenu.tsx
View file @
9afdc589
...
...
@@ -8,6 +8,7 @@ import {
PropType
,
isVNode
,
toRefs
,
toRaw
,
}
from
'vue'
;
import
{
createFromIconfontCN
}
from
'@ant-design/icons-vue'
;
import
'ant-design-vue/es/menu/style'
;
...
...
@@ -54,6 +55,10 @@ export const VueBaseMenuProps = {
type
:
String
as
PropType
<
BaseMenuProps
[
'theme'
]
>
,
default
:
'dark'
,
},
layout
:
{
type
:
String
as
PropType
<
BaseMenuProps
[
'layout'
]
>
,
default
:
'side'
,
},
collapsed
:
{
type
:
Boolean
as
PropType
<
boolean
|
undefined
>
,
default
:
false
,
...
...
@@ -151,6 +156,13 @@ LazyIcon.icon = {
type
:
[
String
,
Function
,
Object
]
as
PropType
<
string
|
Function
|
VNodeChild
|
JSX
.
Element
>
,
};
const
getOpenKeysProps
=
(
openKeys
:
string
[]
|
false
,
{
layout
,
collapsed
})
=>
{
if
(
openKeys
&&
!
collapsed
&&
[
'side'
,
'mix'
].
includes
(
layout
||
'mix'
))
{
return
openKeys
;
}
return
[];
};
export
default
defineComponent
({
name
:
'BaseMenu'
,
props
:
Object
.
assign
(
...
...
@@ -167,6 +179,10 @@ export default defineComponent({
setup
(
props
,
{
emit
})
{
const
{
mode
,
i18n
}
=
toRefs
(
props
);
const
isInline
=
computed
(()
=>
mode
.
value
===
'inline'
);
const
openKeysProps
=
computed
(()
=>
getOpenKeysProps
(
toRaw
(
props
.
openKeys
),
{
layout
:
props
.
layout
,
collapsed
:
props
.
collapsed
}),
);
const
handleOpenChange
:
OpenEventHandler
=
(
openKeys
:
string
[]):
void
=>
{
emit
(
'update:openKeys'
,
openKeys
);
};
...
...
@@ -186,7 +202,7 @@ export default defineComponent({
inlineIndent=
{
16
}
mode=
{
props
.
mode
}
theme=
{
props
.
theme
as
'dark'
|
'light'
}
openKeys=
{
props
.
openKeys
||
[]
}
openKeys=
{
openKeysProps
.
value
}
selectedKeys=
{
props
.
selectedKeys
||
[]
}
onOpenChange=
{
handleOpenChange
}
onSelect=
{
handleSelect
}
...
...
src/TopNavHeader/index.tsx
View file @
9afdc589
...
...
@@ -71,6 +71,7 @@ export const TopNavHeader: FunctionalComponent<TopNavHeaderProps> = props => {
light
:
props
.
theme
===
'light'
,
};
});
console
.
log
(
'onOpenKeys'
,
onOpenKeys
);
return
(
<
div
class=
{
className
.
value
}
>
<
div
ref=
{
headerRef
}
class=
{
`${prefixCls}-main ${contentWidth === 'Fixed' ? 'wide' : ''}`
}
>
...
...
src/utils/index.ts
View file @
9afdc589
...
...
@@ -43,7 +43,6 @@ export function clearMenuItem(menusData: MenuDataItem[]): MenuDataItem[] {
}
delete
finalItem
.
children
;
}
console
.
log
(
'finalItem'
,
finalItem
);
return
finalItem
;
})
.
filter
(
item
=>
item
)
as
MenuDataItem
[];
...
...
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