pane.vue 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. <template>
  2. <ActionMenus
  3. v-if="!store.child.value"
  4. class="menus"
  5. :menus="store.menus as any"
  6. :active-key="store.activeMenuKey.value"
  7. dire="column"
  8. />
  9. <scene-menus
  10. v-if="store.child.value"
  11. @back="store.child.value = null"
  12. :menus="store.child.value as MenuRaw[]"
  13. :level="level + 1"
  14. />
  15. </template>
  16. <script lang="ts" setup>
  17. import ActionMenus from "@/components/group-button/index.vue";
  18. import {generateMixMenus, MenuRaw, menus} from './menus'
  19. import {joinActions} from './actions'
  20. import {computed, onUnmounted} from "vue";
  21. const props = withDefaults(
  22. defineProps<{ menus?: MenuRaw[], level?: number }>(),
  23. {level: 1}
  24. )
  25. const emit = defineEmits<{ (e: 'back'): void }>();
  26. const backMenu = {
  27. icon: "",
  28. text: "返回",
  29. key: "back",
  30. onClick: () => emit("back")
  31. }
  32. const menusMix = computed(() =>
  33. props.level === 1 ? menus : [backMenu, ...props.menus]
  34. )
  35. const store = generateMixMenus(
  36. 'children',
  37. m => m,
  38. menusMix.value
  39. )
  40. onUnmounted(joinActions(store.itemActiveKey));
  41. </script>
  42. <script lang="ts"> export default {name: 'scene-menus'}</script>
  43. <style lang="scss" scoped>
  44. .menus {
  45. position: absolute;
  46. left: var(--boundMargin);
  47. top: 50%;
  48. transform: translateY(-50%);
  49. z-index: 2;
  50. }
  51. </style>