From 375c69132dcd06a46cdbf449aac8760d2e25eab5 Mon Sep 17 00:00:00 2001 From: Liuzj <530604689@qq.com> Date: Sat, 10 Dec 2022 10:45:44 +0800 Subject: [PATCH] fix(pro:layout): the dom still renders without the logo (#1348) --- .../__snapshots__/layoutPro.spec.ts.snap | 4 +- .../pro/layout/__tests__/layoutPro.spec.ts | 66 +++++++++++++++++-- packages/pro/layout/docs/Api.zh.md | 9 +++ packages/pro/layout/src/contents/Logo.tsx | 3 +- packages/pro/layout/src/types.ts | 2 +- 5 files changed, 73 insertions(+), 11 deletions(-) diff --git a/packages/pro/layout/__tests__/__snapshots__/layoutPro.spec.ts.snap b/packages/pro/layout/__tests__/__snapshots__/layoutPro.spec.ts.snap index f513603a7..7e5569b14 100644 --- a/packages/pro/layout/__tests__/__snapshots__/layoutPro.spec.ts.snap +++ b/packages/pro/layout/__tests__/__snapshots__/layoutPro.spec.ts.snap @@ -3,9 +3,7 @@ exports[`ProLayout > render work 1`] = ` "
-
- -
+
  • Sub Menu 1 diff --git a/packages/pro/layout/__tests__/layoutPro.spec.ts b/packages/pro/layout/__tests__/layoutPro.spec.ts index ca6a19a7a..63207bad7 100644 --- a/packages/pro/layout/__tests__/layoutPro.spec.ts +++ b/packages/pro/layout/__tests__/layoutPro.spec.ts @@ -217,6 +217,33 @@ describe('ProLayout', () => { expect(wrapper.find('.ix-pro-layout-sider').exists()).toBe(true) }) + test('logo work', async () => { + const wrapper = ProLayoutMount() + + expect(wrapper.find('.ix-pro-layout-logo').exists()).toBe(false) + + await wrapper.setProps({ + logo: { + image: '../assets/1.png', + title: 'Pro Layout', + }, + }) + + expect(wrapper.find('.ix-pro-layout-logo').exists()).toBe(true) + + await wrapper.setProps({ + type: 'sider', + }) + + expect(wrapper.find('.ix-pro-layout-logo').exists()).toBe(true) + + await wrapper.setProps({ + logo: null, + }) + + expect(wrapper.find('.ix-pro-layout-logo').exists()).toBe(false) + }) + test('slots work', async () => { const wrapper = ProLayoutMount({ props: { type: 'both' }, @@ -230,11 +257,38 @@ describe('ProLayout', () => { }, }) - expect(wrapper.find('.ix-pro-layout-logo').find('#logo').exists()).toBe(true) - expect(wrapper.find('.ix-pro-layout-header-extra').find('#extra').exists()).toBe(true) - expect(wrapper.find('.ix-pro-layout-sider-header').find('#siderHeader').exists()).toBe(true) - expect(wrapper.find('.ix-pro-layout-sider-footer').find('#siderFooter').exists()).toBe(true) - expect(wrapper.find('.ix-pro-layout-content').find('#default').exists()).toBe(true) - expect(wrapper.find('.ix-pro-layout-footer').find('#footer').exists()).toBe(true) + expect(wrapper.find('.ix-pro-layout-header .ix-pro-layout-logo #logo').exists()).toBe(true) + expect(wrapper.find('.ix-pro-layout-sider .ix-pro-layout-logo').exists()).toBe(false) + expect(wrapper.find('.ix-pro-layout-header-extra #extra').exists()).toBe(true) + expect(wrapper.find('.ix-pro-layout-sider-header #siderHeader').exists()).toBe(true) + expect(wrapper.find('.ix-pro-layout-sider-footer #siderFooter').exists()).toBe(true) + expect(wrapper.find('.ix-pro-layout-content #default').exists()).toBe(true) + expect(wrapper.find('.ix-pro-layout-footer #footer').exists()).toBe(true) + + await wrapper.setProps({ + type: 'sider', + }) + + expect(wrapper.find('.ix-pro-layout-header .ix-pro-layout-logo').exists()).toBe(false) + expect(wrapper.find('.ix-pro-layout-sider .ix-pro-layout-logo #logo').exists()).toBe(true) + + const wrapper2 = ProLayoutMount({ + props: { type: 'both' }, + slots: { + siderHeader: () => h('div', { id: 'siderHeader' }), + siderFooter: () => h('div', { id: 'siderFooter' }), + default: () => h('div', { id: 'default' }), + footer: () => h('div', { id: 'footer' }), + }, + }) + + expect(wrapper2.find('.ix-pro-layout-header .ix-pro-layout-logo').exists()).toBe(false) + expect(wrapper2.find('.ix-pro-layout-header-extra').exists()).toBe(false) + + await wrapper2.setProps({ + type: 'sider', + }) + + expect(wrapper2.find('.ix-pro-layout-sider .ix-pro-layout-logo').exists()).toBe(false) }) }) diff --git a/packages/pro/layout/docs/Api.zh.md b/packages/pro/layout/docs/Api.zh.md index 04580e97a..d7e64b373 100644 --- a/packages/pro/layout/docs/Api.zh.md +++ b/packages/pro/layout/docs/Api.zh.md @@ -9,6 +9,7 @@ | `v-model:collapsed` | 侧边栏折叠状态 | `boolean` | `false` | --- | --- | | `fixed` | 顶部栏和侧边栏是否固定 | `boolean \| { sider: boolean, header: boolean }` | `true` | - | - | | `headerMenu` | 顶部菜单组件的更多配置 | `MenuProps` | - | - | 例如:`getKey` | +| `logo` | 自定义 logo | `ProLayoutLogo` | - | - | 一般用于展示 logo, 默认渲染在顶部的左侧区域,当 `type='sider'` 时,渲染在侧边栏的顶部 | | `menus` | 菜单数据 | `MenuData[]` | `[]` | - | - | | `sider` | 侧边栏的更多配置 | `LayoutSiderProps` | - | - | 例如:`collapsed`,`breakpoint`, `pointer` 等配置 | | `siderMenu` | 侧边栏菜单组件的更多配置 | `MenuProps` | - | - | 例如:`getKey`, `indent` 和 `mode` | @@ -16,6 +17,14 @@ | `type` | 布局类型 | `'both' \| 'mixin' \| 'header' \| 'sider'` | `both` | - | 参见示例:[布局类型](#pro-layout-demo-Type) | | `onMenuClick` | 点击菜单回调 | `(options: MenuClickOptions) => void`| - | - | - | +```ts +interface ProLayoutLogo { + image: string | VNode + title: string + link?: string +} +``` + #### ProLayoutSlots | 名称 | 说明 | 参数类型 | 备注 | diff --git a/packages/pro/layout/src/contents/Logo.tsx b/packages/pro/layout/src/contents/Logo.tsx index 157d1bbf4..c295cb18f 100644 --- a/packages/pro/layout/src/contents/Logo.tsx +++ b/packages/pro/layout/src/contents/Logo.tsx @@ -37,7 +37,8 @@ export default defineComponent({ ) } - return
    {logoNode}
    + + return logoNode &&
    {logoNode}
    } }, }) diff --git a/packages/pro/layout/src/types.ts b/packages/pro/layout/src/types.ts index ad50a67b9..75f950ff0 100644 --- a/packages/pro/layout/src/types.ts +++ b/packages/pro/layout/src/types.ts @@ -76,7 +76,7 @@ export type ProLayoutInstance = InstanceType> export interface ProLayoutLogo { image: string | VNode title: string - link: string + link?: string } export type ProLayoutTheme = MenuTheme | { header: MenuTheme; sider: MenuTheme } export type ProLayoutType = 'header' | 'sider' | 'mixin' | 'both'