前端转vue
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

SideMenu.vue 1.3KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. <template>
  2. <a-layout-sider :class="['sider', isDesktop ? null : 'shadow', theme, fixSiderbar ? 'ant-fixed-sidemenu' : null]"
  3. width="256px" :collapsible="collapsible" v-model:collapsed="sideMenuCollapsed" :trigger="null">
  4. <logo />
  5. <Menu :collapsed="collapsed" :menu="menus" :theme="theme" :mode="mode" @select="onSelect"></Menu>
  6. </a-layout-sider>
  7. </template>
  8. <script lang="ts" setup name="SideMenu">
  9. import { watch, ref } from 'vue'
  10. import Logo from '@/components/tools/Logo.vue'
  11. import Menu from './Menu.vue'
  12. import { isDesktop } from '@/utils/device'
  13. import useSiteSettings from '@/store/useSiteSettings'
  14. const props = defineProps({
  15. mode: {
  16. type: String,
  17. required: false,
  18. default: 'inline'
  19. },
  20. theme: {
  21. type: String,
  22. required: false,
  23. default: 'dark'
  24. },
  25. collapsible: {
  26. type: Boolean,
  27. required: false,
  28. default: false
  29. },
  30. collapsed: {
  31. type: Boolean,
  32. required: false,
  33. default: false
  34. },
  35. menus: {
  36. type: Array,
  37. required: true
  38. }
  39. })
  40. const sideMenuCollapsed = ref(false)
  41. watch(
  42. () => props.collapsed,
  43. (newVal) => {
  44. sideMenuCollapsed.value = newVal
  45. },
  46. {
  47. immediate: true
  48. }
  49. );
  50. const emit = defineEmits(['menuSelect'])
  51. const onSelect = (obj) => {
  52. emit('menuSelect', obj)
  53. }
  54. const { fixSiderbar } = useSiteSettings()
  55. </script>