Skip to content

Commit a4a26c9

Browse files
authored
Merge pull request #285 from TsMask/next
2 parents 324c9d5 + 33c3d9a commit a4a26c9

File tree

9 files changed

+94
-53
lines changed

9 files changed

+94
-53
lines changed

packages/pro-layout/README.md

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ const layoutConf = reactive({
120120
| headerRender | custom header render method | `slot` \| (props: BasicLayoutProps) => VNode | - |
121121
| headerContentRender | header content render method only layout side | `slot` \| (props: BasicLayoutProps) => VNode | - |
122122
| rightContentRender | header right content render method | `slot` \| (props: BasicLayoutProps) => VNode | - |
123-
| footerRender | custom footer render method | `slot` \| (props: BasicLayoutProps) => VNode | `false` |
123+
| footerRender | custom footer render method | `slot` \| ({ width, ...BasicLayoutProps }) => VNode | `false` |
124124
| tabRender | custom tab render method | `slot` \| ({ width, ...BasicLayoutProps }) => VNode | `false` |
125125
| breadcrumbRender | custom breadcrumb render method | `slot` \| ({ route, params, routes, paths, h }) => VNode[] | - |
126126
| locale | i18n | Function (key: string) => string \| `false` | `false` |
@@ -138,6 +138,7 @@ const layoutConf = reactive({
138138
| tabList | Tabs title list | `Array<{key: string, tab: sting}>` | - |
139139
| tab-change | Switch panel callback | (key) => void | - |
140140
| tab-active-key | The currently highlighted tab item | string | - |
141+
| breadcrumb | Show Bread crumbs bar | Boolean | - |
141142

142143
### WaterMark
143144

@@ -269,17 +270,29 @@ const layoutConf = reactive({
269270
#### Custom footer with slot
270271

271272
```vue
272-
<GlobalFooter>
273-
<template #links>
274-
<a>链接1</a>
275-
<a>链接2</a>
276-
<a>链接3</a>
277-
<a>链接4</a>
278-
</template>
279-
<template #copyright>
280-
<span>Pro Layout &copy; 2021 Sendya.</span>
281-
</template>
282-
</GlobalFooter>
273+
<template #footerRender="{ width, headerTheme }">
274+
<div>
275+
<footer class="ant-layout-footer" style="height: 36px; line-height: 36px; background: transparent"></footer>
276+
<div
277+
:style="{
278+
margin: '0',
279+
height: '36px',
280+
lineHeight: '36px',
281+
right: '0px',
282+
bottom: '0px',
283+
position: headerTheme == 'dark' ? 'fixed' : 'unset',
284+
zIndex: 14,
285+
padding: '4px 16px',
286+
width: width,
287+
background: '#fff',
288+
boxShadow: '0 1px 4px #0015291f',
289+
transition: 'background 0.3s, width 0.2s'
290+
}"
291+
>
292+
footerRender headerTheme:{{ headerTheme }} width:{{ width }}
293+
</div>
294+
</div>
295+
</template>
283296
```
284297

285298
#### Custom footer with props

packages/pro-layout/examples/layouts/BasicLayout.vue

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@
1919
<!-- custom right-content -->
2020
<template #rightContentRender>
2121
<div style="margin-right: 12px">
22-
<a-avatar shape="square" size="small">
22+
<Avatar shape="square" size="small">
2323
<template #icon>
2424
<UserOutlined />
2525
</template>
26-
</a-avatar>
26+
</Avatar>
2727
</div>
2828
</template>
2929
<!-- custom breadcrumb itemRender -->
@@ -93,10 +93,22 @@ const state = reactive({
9393
splitMenus: true,
9494
// title: 'ProLayout',
9595
// logo: 'https://alicdn.antdv.com/v2/assets/logo.1ef800a8.svg',
96-
navTheme: 'realDark',
96+
97+
// navTheme: 'realDark',
98+
navTheme: 'dark',
99+
headerTheme: 'dark',
100+
97101
layout: 'mix',
102+
// layout: 'side',
103+
// layout: 'top',
104+
98105
fixSiderbar: true,
99106
fixedHeader: true,
107+
108+
headerRender: undefined,
109+
// headerRender: false,
110+
menuHeaderRender: undefined,
111+
// menuHeaderRender: false,
100112
});
101113
const breadcrumb = computed(() =>
102114
router.currentRoute.value.matched.concat().map((item) => {

packages/pro-layout/examples/main.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ import icons from './icons';
88
import 'ant-design-vue/es/result/style';
99
import 'ant-design-vue/es/button/style';
1010
import 'ant-design-vue/es/message/style';
11-
import 'ant-design-vue/dist/antd.dark.less';
11+
import 'ant-design-vue/dist/antd.variable.min.css';
12+
// import 'ant-design-vue/dist/antd.dark.less';
1213
import '@ant-design-vue/pro-layout/style.less';
1314

1415
const app = createApp(App);

packages/pro-layout/examples/router/index.ts

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -55,37 +55,19 @@ const routes: RouteRecordRaw[] = [
5555
{
5656
path: 'child1',
5757
name: 'list-child1-child1',
58-
meta: {
59-
title: '一一级列表页面',
60-
// attach `params` to `$route.params`
61-
params: {
62-
id: 1,
63-
},
64-
},
58+
meta: { title: '一一级列表页面' },
6559
component: () => import('../views/DynamicPage.vue'),
6660
},
6761
{
6862
path: 'child2',
6963
name: 'list-child1-child2',
70-
meta: {
71-
title: '二一级列表页面',
72-
// attach `params` to `$route.params`
73-
params: {
74-
id: 2,
75-
},
76-
},
64+
meta: { title: '二一级列表页面' },
7765
component: () => import('../views/DynamicPage.vue'),
7866
},
7967
{
8068
path: 'child3',
8169
name: 'list-child1-child3',
82-
meta: {
83-
title: '三一级列表页面',
84-
// attach `params` to `$route.params`
85-
params: {
86-
id: 3,
87-
},
88-
},
70+
meta: { title: '三一级列表页面' },
8971
component: () => import('../views/DynamicPage.vue'),
9072
},
9173
],
@@ -107,7 +89,7 @@ const routes: RouteRecordRaw[] = [
10789
{
10890
path: '/test-tab',
10991
name: 'TestTab',
110-
meta: { title: '测试Tab标签', hideInMenu: false },
92+
meta: { title: '测试Tab标签', icon:'icon-icon-test', hideInMenu: false },
11193
component: () => import('../views/TestTab.vue'),
11294
},
11395
{

packages/pro-layout/examples/views/DynamicPage.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<template>
2-
<page-container :title="`${$route.meta.title} ${$route.params.id}`" sub-title="is a sub-title.">
2+
<page-container :title="`${$route.meta.title}`" sub-title="is a sub-title.">
33
<template #content>
44
<div>
55
container.content

packages/pro-layout/examples/views/TestTab.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
:tab-list="tabList"
77
:tab-active-key="tabActiveKey"
88
@tab-change="tabChange"
9+
:breadcrumb="false"
910
:tabProps="{
1011
hideAdd: true,
1112
tabPosition: 'top',

packages/pro-layout/src/BasicLayout.tsx

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,21 @@ const ProLayout = defineComponent({
313313
}
314314
return tabRender({ width, ...props });
315315
});
316+
317+
const footerDom = computed(() => {
318+
if (props.footerRender === false || !footerRender) {
319+
return null;
320+
}
321+
let layout = props.layout;
322+
// 计算侧边栏的宽度,不然导致左边的样式会出问题
323+
let width = '100%';
324+
if (layout === 'mix' && hasSplitMenu.value && flatMenuData.value.length === 0) {
325+
width = '100%';
326+
} else if(!isTop.value && !isMobile.value){
327+
width = `calc(100% - ${siderWidth.value}px)`;
328+
}
329+
return footerRender({ width, ...props });
330+
});
316331

317332
routeContext.hasHeader = !!headerDom.value;
318333

@@ -363,7 +378,7 @@ const ProLayout = defineComponent({
363378
>
364379
{props.loading ? <PageLoading /> : slots.default?.()}
365380
</WrapContent>
366-
{footerRender && footerRender(props)}
381+
{footerDom.value}
367382
</div>
368383
</Layout>
369384
</div>

packages/pro-layout/src/components/PageContainer/index.tsx

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,10 @@ export const pageContainerProps = {
116116
type: Boolean,
117117
default: () => undefined,
118118
}, //PropTypes.looseBool,
119+
breadcrumb: {
120+
type: Boolean,
121+
default: () => undefined,
122+
},
119123
};
120124

121125
export type PageContainerProps = Partial<ExtractPropTypes<typeof pageContainerProps>>;
@@ -182,6 +186,7 @@ const ProPageHeader: FunctionalComponent<PageContainerProps & { prefixedClassNam
182186
title,
183187
tabList,
184188
tabActiveKey,
189+
breadcrumb,
185190
content,
186191
pageHeaderRender,
187192
header,
@@ -191,7 +196,6 @@ const ProPageHeader: FunctionalComponent<PageContainerProps & { prefixedClassNam
191196
fixedHeader: _,
192197
...restProps
193198
} = props;
194-
const value = useRouteContext();
195199

196200
if (pageHeaderRender === false) {
197201
return null;
@@ -200,25 +204,26 @@ const ProPageHeader: FunctionalComponent<PageContainerProps & { prefixedClassNam
200204
return pageHeaderRender({ ...props });
201205
}
202206

203-
let pageHeaderTitle = title;
204-
if (!title && title !== false) {
205-
pageHeaderTitle = value.title;
206-
}
207+
const pageHeaderTitle = title !== false ? title : undefined;
207208

208-
const unrefBreadcrumb = unref(value.breadcrumb || {});
209-
const breadcrumb = restProps.breadcrumb || {
210-
...unrefBreadcrumb,
211-
routes: unrefBreadcrumb.routes,
212-
itemRender: unrefBreadcrumb.itemRender,
213-
};
209+
let pageHeaderBreadcrumb = undefined;
210+
if(breadcrumb !== false){
211+
const value = useRouteContext();
212+
const unrefBreadcrumb = unref(value.breadcrumb || {});
213+
pageHeaderBreadcrumb = {
214+
...unrefBreadcrumb,
215+
routes: unrefBreadcrumb.routes,
216+
itemRender: unrefBreadcrumb.itemRender,
217+
};
218+
}
214219

215220
return (
216221
<div class={`${prefixedClassName}-wrap`}>
217222
<PageHeader
218223
{...restProps}
219224
// {...value}
220225
title={pageHeaderTitle}
221-
breadcrumb={breadcrumb}
226+
breadcrumb={pageHeaderBreadcrumb}
222227
footer={renderFooter({
223228
...restProps,
224229
tabList,

packages/pro-layout/src/components/SiderMenu/SiderMenu.tsx

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,18 @@ const SiderMenu: FunctionalComponent<SiderMenuProps> = (props: SiderMenuProps) =
159159
const hasSplitMenu = computed(() => props.layout === 'mix' && props.splitMenus);
160160
const sTheme = computed(() => (props.layout === 'mix' && props.navTheme !== 'realDark' && 'light') || props.navTheme);
161161
const sSideWidth = computed(() => (props.collapsed ? props.collapsedWidth : props.siderWidth));
162+
const sSideHeaderTop = computed(() => {
163+
if(props.layout === 'mix'){
164+
// 混合菜单布局去除顶栏
165+
if(Reflect.get(props, 'headerRender') === false){
166+
return undefined;
167+
}
168+
if(!props.isMobile) {
169+
return `${props.headerHeight}px`;
170+
}
171+
}
172+
return undefined;
173+
});
162174
const classNames = computed(() => {
163175
return {
164176
[baseClassName]: true,
@@ -234,7 +246,7 @@ const SiderMenu: FunctionalComponent<SiderMenuProps> = (props: SiderMenuProps) =
234246
collapsedWidth={collapsedWidth}
235247
style={{
236248
overflow: 'hidden',
237-
paddingTop: props.layout === 'mix' && !props.isMobile ? `${props.headerHeight}px` : undefined,
249+
paddingTop: sSideHeaderTop.value,
238250
}}
239251
width={siderWidth}
240252
theme={sTheme.value === 'realDark' ? 'dark' : sTheme.value}

0 commit comments

Comments
 (0)