pane.vue 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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, findMenuByKey} from './menus'
  19. import {joinActions} from './actions'
  20. import {computed, onMounted, onUnmounted, watchEffect} from "vue";
  21. import {disabledMap} from "@/hook";
  22. const props = withDefaults(
  23. defineProps<{ menus?: MenuRaw[], level?: number }>(),
  24. {level: 1}
  25. )
  26. const emit = defineEmits<{
  27. (e: 'back'): void,
  28. (e: 'enterChild'): void,
  29. (e: 'leaveChild'): void,
  30. }>();
  31. const backMenu = {
  32. icon: "return",
  33. text: "",
  34. key: "back",
  35. onClick: () => emit("back")
  36. }
  37. const menusMix = computed(() =>
  38. props.level === 1 ? menus : [backMenu, ...props.menus]
  39. )
  40. const store = generateMixMenus(
  41. 'children',
  42. m => m,
  43. menusMix.value
  44. )
  45. watchEffect((onCleanup) => {
  46. const menu = store.activeMenuKey.value && findMenuByKey(store.activeMenuKey.value)
  47. if (store.child && menu?.onClick) {
  48. const leaveHook = menu.onClick()
  49. leaveHook && onCleanup(leaveHook)
  50. } else {
  51. onCleanup(() => {})
  52. }
  53. })
  54. if (props.level === 1) {
  55. watchEffect(() => {
  56. disabledMap.photo = !store.child.value?.length
  57. })
  58. watchEffect(() => {
  59. if (store.child.value) {
  60. emit('enterChild')
  61. } else {
  62. emit('leaveChild')
  63. }
  64. })
  65. }
  66. onUnmounted(joinActions(store.itemActiveKey));
  67. onMounted(() => {
  68. if (props.level > 1) {
  69. const defaultMenu = props.menus.find(menu => {
  70. if (typeof menu.defaultSelect === 'function') {
  71. return menu.defaultSelect()
  72. } else {
  73. return menu.defaultSelect
  74. }
  75. })
  76. console.log(defaultMenu)
  77. store.itemActiveKey.value = defaultMenu?.key
  78. // store.activeMenuKey.value =
  79. }
  80. })
  81. </script>
  82. <script lang="ts"> export default {name: 'scene-menus'}</script>
  83. <style lang="scss" scoped>
  84. .menus {
  85. position: absolute;
  86. left: var(--boundMargin);
  87. top: 50%;
  88. transform: translateY(-50%);
  89. z-index: 2;
  90. }
  91. </style>