BasicLayout.vue 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. <template>
  2. <pro-layout
  3. title="Ant Design Pro"
  4. :menus="menus"
  5. :collapsed="collapsed"
  6. :mediaQuery="query"
  7. :isMobile="isMobile"
  8. :handleMediaQuery="handleMediaQuery"
  9. :handleCollapse="handleCollapse"
  10. :logo="logoRender"
  11. :i18nRender="i18nRender"
  12. v-bind="settings"
  13. >
  14. <setting-drawer :settings="settings" @change="handleSettingChange" />
  15. <template v-slot:rightContentRender>
  16. <right-content :top-menu="settings.layout === 'topmenu'" :theme="settings.theme" />
  17. </template>
  18. <template v-slot:footerRender>
  19. <global-footer />
  20. </template>
  21. <router-view />
  22. </pro-layout>
  23. </template>
  24. <script>
  25. import { SettingDrawer } from '@ant-design-vue/pro-layout'
  26. import { i18nRender } from '@/locales'
  27. import { mapState } from 'vuex'
  28. import { SIDEBAR_TYPE, TOGGLE_MOBILE_TYPE } from '@/store/mutation-types'
  29. import RightContent from '@/components/GlobalHeader/RightContent'
  30. import GlobalFooter from '@/components/GlobalFooter'
  31. import LogoSvg from '../assets/logo.svg?inline'
  32. export default {
  33. name: 'BasicLayout',
  34. components: {
  35. SettingDrawer,
  36. RightContent,
  37. GlobalFooter
  38. },
  39. data () {
  40. return {
  41. // base
  42. menus: [],
  43. // 侧栏收起状态
  44. collapsed: false,
  45. settings: {
  46. // 布局类型
  47. layout: 'sidemenu', // 'sidemenu', 'topmenu'
  48. // 定宽: true / 流式: false
  49. contentWidth: false,
  50. // 主题 'dark' | 'light'
  51. theme: 'dark',
  52. // 主色调
  53. primaryColor: '#1890ff',
  54. fixedHeader: false,
  55. fixSiderbar: false,
  56. colorWeak: false,
  57. hideHintAlert: false,
  58. hideCopyButton: false
  59. },
  60. // 媒体查询
  61. query: {},
  62. // 是否手机模式
  63. isMobile: false
  64. }
  65. },
  66. computed: {
  67. ...mapState({
  68. // 动态主路由
  69. mainMenu: state => state.permission.addRouters
  70. })
  71. },
  72. created () {
  73. const routes = this.mainMenu.find(item => item.path === '/')
  74. this.menus = (routes && routes.children) || []
  75. // 处理侧栏收起状态
  76. this.$watch('collapsed', () => {
  77. this.$store.commit(SIDEBAR_TYPE, this.collapsed)
  78. })
  79. this.$watch('isMobile', () => {
  80. this.$store.commit(TOGGLE_MOBILE_TYPE, this.isMobile)
  81. })
  82. },
  83. mounted () {
  84. const userAgent = navigator.userAgent
  85. if (userAgent.indexOf('Edge') > -1) {
  86. this.$nextTick(() => {
  87. this.collapsed = !this.collapsed
  88. setTimeout(() => {
  89. this.collapsed = !this.collapsed
  90. }, 16)
  91. })
  92. }
  93. },
  94. methods: {
  95. i18nRender,
  96. handleMediaQuery (val) {
  97. this.query = val
  98. if (this.isMobile && !val['screen-xs']) {
  99. this.isMobile = false
  100. return
  101. }
  102. if (!this.isMobile && val['screen-xs']) {
  103. this.isMobile = true
  104. this.collapsed = false
  105. }
  106. },
  107. handleCollapse (val) {
  108. this.collapsed = val
  109. },
  110. handleSettingChange ({ type, value }) {
  111. console.log('type', type, value)
  112. type && (this.settings[type] = value)
  113. switch (type) {
  114. case 'contentWidth':
  115. this.settings[type] = value === 'Fixed'
  116. break
  117. case 'layout':
  118. if (value === 'sidemenu') {
  119. this.settings.contentWidth = false
  120. } else {
  121. this.settings.fixSiderbar = false
  122. this.settings.contentWidth = true
  123. }
  124. break
  125. }
  126. },
  127. logoRender () {
  128. return <LogoSvg />
  129. }
  130. }
  131. }
  132. </script>
  133. <style lang="less">
  134. @import "./BasicLayout.less";
  135. </style>