@@ -3,21 +3,20 @@ import {
3
3
defineComponent ,
4
4
unref ,
5
5
toRefs ,
6
+ type FunctionalComponent ,
6
7
type VNode ,
7
8
type VNodeChild ,
8
9
type PropType ,
9
10
type ExtractPropTypes ,
10
11
} from 'vue'
11
12
/* replace antd ts define */
12
- import omit from 'omit.js'
13
-
14
13
import PageHeader , { pageHeaderProps } from 'ant-design-vue/es/page-header'
15
14
import { Tabs , Affix , Spin } from 'ant-design-vue'
16
15
import type { TabPaneProps } from './interfaces/TabPane'
17
16
import type { TabBarExtraContent /*, TabsProps */ } from './interfaces/Tabs'
18
17
import type { AffixProps } from './interfaces/Affix'
19
18
/* replace antd ts define end */
20
- import { type RouteContextProps , useRouteContext } from '../../RouteContext'
19
+ import { useRouteContext } from '../../RouteContext'
21
20
import { getSlot , getSlotVNode } from '../../utils'
22
21
import 'ant-design-vue/es/affix/style'
23
22
import 'ant-design-vue/es/page-header/style'
@@ -104,13 +103,14 @@ export const pageContainerProps = {
104
103
} ,
105
104
pageHeaderRender : {
106
105
type : [ Object , Function , Boolean ] as PropType < PageHeaderRender > ,
106
+ default : ( ) => undefined ,
107
107
} ,
108
108
affixProps : {
109
109
type : [ Object , Function ] as PropType < AffixProps > ,
110
110
} ,
111
111
ghost : {
112
112
type : Boolean ,
113
- default : ( ) => undefined ,
113
+ default : ( ) => false ,
114
114
} , //PropTypes.looseBool,
115
115
loading : {
116
116
type : Boolean ,
@@ -177,41 +177,58 @@ const renderPageHeader = (
177
177
)
178
178
}
179
179
180
- const defaultPageHeaderRender = (
181
- props : PageContainerProps ,
182
- value : Required < RouteContextProps > & { prefixedClassName : string }
183
- ) => {
184
- const { title, tabList, tabActiveKey, content, pageHeaderRender, header, extraContent, ...restProps } = omit ( props , [
185
- 'prefixCls' ,
186
- ] )
180
+ const ProPageHeader : FunctionalComponent < PageContainerProps & { prefixedClassName : string } > = ( props ) => {
181
+ const {
182
+ title,
183
+ tabList,
184
+ tabActiveKey,
185
+ content,
186
+ pageHeaderRender,
187
+ header,
188
+ extraContent,
189
+ prefixedClassName,
190
+ prefixCls,
191
+ ...restProps
192
+ } = props
193
+ const value = useRouteContext ( )
194
+
195
+ if ( pageHeaderRender === false ) {
196
+ return null
197
+ }
187
198
if ( pageHeaderRender ) {
188
- return pageHeaderRender ( { ...props , ... value } )
199
+ return pageHeaderRender ( { ...props } )
189
200
}
201
+
190
202
let pageHeaderTitle = title
191
203
if ( ! title && title !== false ) {
192
204
pageHeaderTitle = value . title
193
205
}
206
+
194
207
const unrefBreadcrumb = unref ( value . breadcrumb || { } )
195
208
const breadcrumb = restProps . breadcrumb || {
196
209
...unrefBreadcrumb ,
197
210
routes : unrefBreadcrumb . routes ,
198
211
itemRender : unrefBreadcrumb . itemRender ,
199
212
}
200
- // inject value
213
+
201
214
return (
202
- < PageHeader
203
- { ...restProps }
204
- title = { pageHeaderTitle }
205
- breadcrumb = { breadcrumb }
206
- footer = { renderFooter ( {
207
- ...restProps ,
208
- tabList,
209
- tabActiveKey,
210
- prefixedClassName : value . prefixedClassName ,
211
- } ) }
212
- >
213
- { header || renderPageHeader ( content , extraContent , value . prefixedClassName ) }
214
- </ PageHeader >
215
+ < div class = { `${ prefixedClassName } -wrap` } >
216
+ < PageHeader
217
+ { ...restProps }
218
+ { ...value }
219
+ title = { pageHeaderTitle }
220
+ breadcrumb = { breadcrumb }
221
+ footer = { renderFooter ( {
222
+ ...restProps ,
223
+ tabList,
224
+ tabActiveKey,
225
+ prefixedClassName,
226
+ } ) }
227
+ prefixCls = { prefixCls }
228
+ >
229
+ { header || renderPageHeader ( content , extraContent , prefixedClassName ) }
230
+ </ PageHeader >
231
+ </ div >
215
232
)
216
233
}
217
234
@@ -231,39 +248,42 @@ const PageContainer = defineComponent({
231
248
[ `${ prefixCls } -page-container-ghost` ] : ghost . value ,
232
249
}
233
250
} )
234
-
235
251
const headerDom = computed ( ( ) => {
236
252
const tags = getSlotVNode < DefaultPropRender > ( slots , props , 'tags' )
237
253
const headerContent = getSlotVNode < DefaultPropRender > ( slots , props , 'content' )
238
254
const extra = getSlotVNode < DefaultPropRender > ( slots , props , 'extra' )
239
255
const extraContent = getSlotVNode < DefaultPropRender > ( slots , props , 'extraContent' )
256
+ // {
257
+ // ...props,
258
+ // tags,
259
+ // content: headerContent,
260
+ // extra,
261
+ // extraContent,
262
+ // prefixCls: undefined,
263
+ // prefixedClassName: prefixedClassName.value,
264
+ // }
240
265
return (
241
- < div class = { `${ prefixedClassName . value } -warp` } >
242
- { defaultPageHeaderRender (
243
- {
244
- ...props ,
245
- tags,
246
- content : headerContent ,
247
- extra,
248
- extraContent,
249
- prefixCls : undefined ,
250
- } ,
251
- {
252
- ...value ,
253
- prefixedClassName : prefixedClassName . value ,
254
- }
255
- ) }
256
- </ div >
266
+ < ProPageHeader
267
+ { ...props }
268
+ prefixCls = { undefined }
269
+ prefixedClassName = { prefixedClassName . value }
270
+ ghost = { ghost . value }
271
+ content = { headerContent }
272
+ tags = { tags }
273
+ extra = { extra }
274
+ extraContent = { extraContent }
275
+ />
257
276
)
258
277
} )
259
278
260
279
return ( ) => {
280
+ const { fixedHeader } = props
261
281
const footer = getSlot ( slots , props , 'footer' )
262
282
263
283
return (
264
284
< div class = { classNames . value } >
265
- { value . fixedHeader ? (
266
- < Affix offsetTop = { value . fixedHeader ? value . headerHeight : 0 } { ... affixProps . value } >
285
+ { fixedHeader && headerDom . value ? (
286
+ < Affix { ... affixProps . value } offsetTop = { value . hasHeader && value . fixedHeader ? value . headerHeight : 0 } >
267
287
{ headerDom . value }
268
288
</ Affix >
269
289
) : (
0 commit comments