index.tsx 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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. import { createBreakpointListen } from '/@/hooks/event/useBreakpoint';
  20. import { isMobile } from '/@/utils/is';
  21. export default defineComponent({
  22. name: 'DefaultLayout',
  23. setup() {
  24. const { currentRoute } = useRouter();
  25. const headerRef = ref<ComponentRef>(null);
  26. const isMobileRef = ref(false);
  27. createLayoutContext({ fullHeader: headerRef, isMobile: isMobileRef });
  28. createBreakpointListen(() => {
  29. isMobileRef.value = isMobile();
  30. });
  31. // ! Only register global components here
  32. // ! Can reduce the size of the first screen code
  33. // default layout It is loaded after login. So it won’t be packaged to the first screen
  34. registerGlobComp();
  35. const { getShowFullHeaderRef } = useHeaderSetting();
  36. const { getUseOpenBackTop, getShowSettingButton, getShowFooter } = useRootSetting();
  37. const { getShowMenu, getMenuMode, getSplit } = useMenuSetting();
  38. const { getFullContent } = useFullContent();
  39. const getShowLayoutFooter = computed(() => {
  40. return unref(getShowFooter) && !unref(currentRoute).meta?.hiddenFooter;
  41. });
  42. const showSideBarRef = computed(() => {
  43. return (
  44. unref(getSplit) ||
  45. (unref(getShowMenu) &&
  46. unref(getMenuMode) !== MenuModeEnum.HORIZONTAL &&
  47. !unref(getFullContent))
  48. );
  49. });
  50. function renderFeatures() {
  51. return (
  52. <>
  53. <LayoutLockPage />
  54. {/* back top */}
  55. {unref(getUseOpenBackTop) && <BackTop target={() => document.body} />}
  56. {/* open setting drawer */}
  57. {unref(getShowSettingButton) && <SettingBtn />}
  58. </>
  59. );
  60. }
  61. return () => {
  62. return (
  63. <Layout class="default-layout">
  64. {() => (
  65. <>
  66. {renderFeatures()}
  67. {unref(getShowFullHeaderRef) && <LayoutHeader fixed={true} ref={headerRef} />}
  68. <Layout>
  69. {() => (
  70. <>
  71. {unref(showSideBarRef) && <LayoutSideBar />}
  72. <Layout class="default-layout__main">
  73. {() => (
  74. <>
  75. <LayoutMultipleHeader />
  76. <LayoutContent />
  77. {unref(getShowLayoutFooter) && <LayoutFooter />}
  78. </>
  79. )}
  80. </Layout>
  81. </>
  82. )}
  83. </Layout>
  84. </>
  85. )}
  86. </Layout>
  87. );
  88. };
  89. },
  90. });