index.tsx 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import './index.less';
  2. import { defineComponent, unref, computed, ref } from 'vue';
  3. import { Layout, BackTop } from 'ant-design-vue';
  4. import LayoutHeader from './header/LayoutHeader';
  5. import LayoutContent from './content';
  6. import LayoutFooter from './footer';
  7. import LayoutLockPage from './lock';
  8. import LayoutSideBar from './sider';
  9. import SettingBtn from './setting/index.vue';
  10. import LayoutMultipleHeader from './header/LayoutMultipleHeader';
  11. import { MenuModeEnum } from '/@/enums/menuEnum';
  12. import { useRouter } from 'vue-router';
  13. import { useFullContent } from '/@/hooks/web/useFullContent';
  14. import { useHeaderSetting } from '/@/hooks/setting/useHeaderSetting';
  15. import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
  16. import { useRootSetting } from '/@/hooks/setting/useRootSetting';
  17. import { createLayoutContext } from './useLayoutContext';
  18. import { registerGlobComp } from '/@/components/registerGlobComp';
  19. export default defineComponent({
  20. name: 'DefaultLayout',
  21. setup() {
  22. const { currentRoute } = useRouter();
  23. const headerRef = ref<ComponentRef>(null);
  24. createLayoutContext({ fullHeaderRef: headerRef });
  25. // ! Only register global components here
  26. // ! Can reduce the size of the first screen code
  27. // default layout It is loaded after login. So it won’t be packaged to the first screen
  28. registerGlobComp();
  29. const { getShowFullHeaderRef } = useHeaderSetting();
  30. const { getUseOpenBackTop, getShowSettingButton, getShowFooter } = useRootSetting();
  31. const { getShowMenu, getMenuMode, getSplit } = useMenuSetting();
  32. const { getFullContent } = useFullContent();
  33. const getShowLayoutFooter = computed(() => {
  34. return unref(getShowFooter) && !unref(currentRoute).meta?.hiddenFooter;
  35. });
  36. const showSideBarRef = computed(() => {
  37. return (
  38. unref(getSplit) ||
  39. (unref(getShowMenu) &&
  40. unref(getMenuMode) !== MenuModeEnum.HORIZONTAL &&
  41. !unref(getFullContent))
  42. );
  43. });
  44. function renderFeatures() {
  45. return (
  46. <>
  47. <LayoutLockPage />
  48. {/* back top */}
  49. {unref(getUseOpenBackTop) && <BackTop target={() => document.body} />}
  50. {/* open setting drawer */}
  51. {unref(getShowSettingButton) && <SettingBtn />}
  52. </>
  53. );
  54. }
  55. return () => {
  56. return (
  57. <Layout class="default-layout">
  58. {() => (
  59. <>
  60. {renderFeatures()}
  61. {unref(getShowFullHeaderRef) && <LayoutHeader fixed={true} ref={headerRef} />}
  62. <Layout>
  63. {() => (
  64. <>
  65. {unref(showSideBarRef) && <LayoutSideBar />}
  66. <Layout>
  67. {() => (
  68. <>
  69. <LayoutMultipleHeader />
  70. <LayoutContent />
  71. {unref(getShowLayoutFooter) && <LayoutFooter />}
  72. </>
  73. )}
  74. </Layout>
  75. </>
  76. )}
  77. </Layout>
  78. </>
  79. )}
  80. </Layout>
  81. );
  82. };
  83. },
  84. });