1- import { computed , FunctionalComponent , CSSProperties , VNodeChild , VNode , unref } from 'vue' ;
1+ import { computed , FunctionalComponent , CSSProperties , unref } from 'vue' ;
22import 'ant-design-vue/es/layout/style' ;
33import Layout from 'ant-design-vue/es/layout' ;
44import { withInstall } from 'ant-design-vue/es/_util/type' ;
55import { default as ProProvider , ProProviderData } from './ProProvider' ;
66import { default as SiderMenuWrapper , SiderMenuWrapperProps } from './SiderMenu' ;
77import { WrapContent } from './WrapContent' ;
88import { default as Header , HeaderViewProps } from './Header' ;
9- import { RenderVNodeType , WithFalse } from './typings' ;
10- import { getComponentOrSlot , PropRenderType , PropTypes } from './utils' ;
9+ import { VNodeType , CustomRender , WithFalse } from './typings' ;
10+ import { getCustomRender , PropRenderType , PropTypes } from './utils' ;
1111import useMediaQuery from './hooks/useMediaQuery' ;
1212import './BasicLayout.less' ;
1313
@@ -19,7 +19,7 @@ export type BasicLayoutProps = SiderMenuWrapperProps &
1919 /**
2020 *@name logo url
2121 */
22- logo ?: string | RenderVNodeType | WithFalse < string | RenderVNodeType > ;
22+ logo ?: VNodeType ;
2323
2424 loading ?: boolean ;
2525
@@ -29,11 +29,9 @@ export type BasicLayoutProps = SiderMenuWrapperProps &
2929
3030 onCollapse ?: ( collapsed : boolean ) => void ;
3131
32- footerRender ?: WithFalse <
33- ( props : any /* FooterProps */ , defaultDom : RenderVNodeType ) => RenderVNodeType
34- > ;
32+ footerRender ?: WithFalse < ( props : any /* FooterProps */ ) => VNodeType > ;
3533
36- headerRender ?: WithFalse < ( props : any /* HeaderProps */ ) => RenderVNodeType > ;
34+ headerRender ?: WithFalse < ( props : any /* HeaderProps */ ) => VNodeType > ;
3735
3836 colSize ?: string ;
3937 /**
@@ -68,19 +66,16 @@ const ProLayout: FunctionalComponent<BasicLayoutProps> = (props, { emit, slots }
6866 const isTop = computed ( ( ) => layout === 'top' ) ;
6967 // const isSide = computed(() => layout === 'side');
7068 // const isMix = computed(() => layout === 'mix');
71-
72- const handleCollapse = ( collapsed : boolean ) => {
73- propsOnCollapse && propsOnCollapse ( collapsed ) ;
74- emit ( 'update:collapsed' , collapsed ) ;
75- } ;
76- const handleOpenKeys = ( openKeys : string [ ] | false ) : void => {
77- propsOnOpenKeys && propsOnOpenKeys ( openKeys ) ;
78- emit ( 'update:open-keys' , openKeys ) ;
79- } ;
80- const handleSelect = ( selectedKeys : string [ ] | false ) : void => {
81- propsOnSelect && propsOnSelect ( selectedKeys ) ;
82- emit ( 'update:selected-keys' , selectedKeys ) ;
83- } ;
69+ // if on event and @event
70+ const onCollapse =
71+ ( propsOnCollapse && propsOnCollapse ) ||
72+ ( ( collapsed : boolean ) => emit ( 'update:collapsed' , collapsed ) ) ;
73+ const onOpenKeys =
74+ ( propsOnOpenKeys && propsOnOpenKeys ) ||
75+ ( ( openKeys : string [ ] | false ) => emit ( 'update:open-keys' , openKeys ) ) ;
76+ const onSelect =
77+ ( propsOnSelect && propsOnSelect ) ||
78+ ( ( selectedKeys : string [ ] | false ) => emit ( 'update:selected-keys' , selectedKeys ) ) ;
8479 const colSize = useMediaQuery ( ) ;
8580 const isMobile = computed (
8681 ( ) => ( colSize . value === 'sm' || colSize . value === 'xs' ) && ! props . disableMobile ,
@@ -115,42 +110,39 @@ const ProLayout: FunctionalComponent<BasicLayoutProps> = (props, { emit, slots }
115110 const headerRender = (
116111 props : BasicLayoutProps & {
117112 hasSiderMenu : boolean ;
118- customHeaderRender : VNodeChild | false ;
119- rightContentRender : VNodeChild | VNode | false ;
113+ customHeaderRender : WithFalse < CustomRender > ;
114+ rightContentRender : WithFalse < CustomRender > ;
120115 } ,
121116 matchMenuKeys : string [ ] ,
122- ) : RenderVNodeType => {
117+ ) : VNodeType => {
123118 if ( props . headerRender === false || props . pure ) {
124119 return null ;
125120 }
126121 return < Header matchMenuKeys = { matchMenuKeys } { ...props } headerHeight = { 48 } /> ;
127122 } ;
128- const rightContentRender = getComponentOrSlot ( props , slots , 'rightContentRender' ) as any ;
129- const customHeaderRender = getComponentOrSlot ( props , slots , 'headerRender' ) ;
130- const menuHeaderRenderFunc = props [ 'menuHeaderRender' ] ;
131- const menuHeaderRenderSlot = slots [ 'menuHeaderRender' ] ;
123+ const rightContentRender = getCustomRender ( props , slots , 'rightContentRender' ) ;
124+ const customHeaderRender = getCustomRender ( props , slots , 'headerRender' ) ;
125+ const menuHeaderRender = getCustomRender ( props , slots , 'menuHeaderRender' ) ;
126+ const footerRender = getCustomRender ( props , slots , 'footerRender' ) ;
127+ // const menuRender = getCustomRender(props, slots, 'menuRender');
128+
132129 const headerDom = headerRender (
133130 {
134131 ...props ,
135132 hasSiderMenu : ! isTop . value ,
136133 menuData,
137134 isMobile : unref ( isMobile ) ,
138- onCollapse : handleCollapse ,
139- onSelect : handleSelect ,
140- onOpenKeys : handleOpenKeys ,
135+ onCollapse,
136+ onOpenKeys ,
137+ onSelect ,
141138 customHeaderRender,
142139 rightContentRender,
143- headerTitleRender :
144- menuHeaderRenderFunc || ( menuHeaderRenderSlot && ( ( ) => menuHeaderRenderSlot ( ) ) ) ,
140+ headerTitleRender : menuHeaderRender ,
145141 theme : ( navTheme || 'dark' ) . toLocaleLowerCase ( ) . includes ( 'dark' ) ? 'dark' : 'light' ,
146142 } ,
147143 matchMenuKeys ,
148144 ) ;
149145
150- const footerRender = getComponentOrSlot ( props , slots , 'footerRender' ) ;
151- // const menuRender = getComponentOrSlot(props, slots, 'menuRender');
152- // const menuHeaderRender = getComponentOrSlot(props, slots, 'menuHeaderRender');
153-
154146 return (
155147 < ProProvider i18n = { defaultI18nRender } >
156148 { props . pure ? (
@@ -162,12 +154,10 @@ const ProLayout: FunctionalComponent<BasicLayoutProps> = (props, { emit, slots }
162154 < SiderMenuWrapper
163155 { ...props }
164156 isMobile = { isMobile . value }
165- menuHeaderRender = {
166- menuHeaderRenderFunc || ( menuHeaderRenderSlot && ( ( ) => menuHeaderRenderSlot ( ) ) )
167- }
168- onCollapse = { handleCollapse }
169- onSelect = { handleSelect }
170- onOpenKeys = { handleOpenKeys }
157+ menuHeaderRender = { menuHeaderRender }
158+ onCollapse = { onCollapse }
159+ onSelect = { onSelect }
160+ onOpenKeys = { onOpenKeys }
171161 />
172162 ) }
173163 < Layout style = { genLayoutStyle } >
@@ -178,7 +168,7 @@ const ProLayout: FunctionalComponent<BasicLayoutProps> = (props, { emit, slots }
178168 >
179169 { slots . default ?.( ) }
180170 </ WrapContent >
181- { footerRender !== false && footerRender && footerRender }
171+ { footerRender && footerRender ( props ) }
182172 </ Layout >
183173 </ Layout >
184174 </ div >
@@ -266,6 +256,8 @@ ProLayout.props = {
266256 collapsed : PropTypes . bool ,
267257 /* 菜单的折叠收起事件 (collapsed: boolean) => void */
268258 onCollapse : PropTypes . func ,
259+ onSelect : PropTypes . func ,
260+ onOpenKeys : PropTypes . func ,
269261 // onPageChange // 请使用 vue-router 监听
270262 /* 禁止自动切换到移动页面 */
271263 disableMobile : PropTypes . bool ,
0 commit comments