From 9dfa701454d6a94690bad39dbb0e38f2a0b31489 Mon Sep 17 00:00:00 2001 From: Ben Lin <maobin001@msn.com> Date: 星期二, 18 六月 2024 18:08:47 +0800 Subject: [PATCH] build --- src/components/SimpleMenu/src/components/Menu.vue | 241 +++++++++++++++++++++++------------------------ 1 files changed, 118 insertions(+), 123 deletions(-) diff --git a/src/components/SimpleMenu/src/components/Menu.vue b/src/components/SimpleMenu/src/components/Menu.vue index 28e0b3e..596fdef 100644 --- a/src/components/SimpleMenu/src/components/Menu.vue +++ b/src/components/SimpleMenu/src/components/Menu.vue @@ -4,11 +4,10 @@ </ul> </template> -<script lang="ts"> +<script lang="ts" setup> import type { PropType } from 'vue'; import type { SubMenuProvider } from './types'; import { - defineComponent, ref, computed, onMounted, @@ -18,140 +17,136 @@ getCurrentInstance, provide, } from 'vue'; + import { useDesign } from '@/hooks/web/useDesign'; + import { propTypes } from '@/utils/propTypes'; + import { createSimpleRootMenuContext, type MenuEmitterEvents } from './useSimpleMenuContext'; + import { mitt } from '@/utils/mitt'; - import { useDesign } from '/@/hooks/web/useDesign'; - import { propTypes } from '/@/utils/propTypes'; - import { createSimpleRootMenuContext } from './useSimpleMenuContext'; - import { mitt } from '/@/utils/mitt'; + defineOptions({ name: 'Menu' }); - export default defineComponent({ - name: 'Menu', - props: { - theme: propTypes.oneOf(['light', 'dark']).def('light'), - activeName: propTypes.oneOfType([propTypes.string, propTypes.number]), - openNames: { - type: Array as PropType<string[]>, - default: () => [], - }, - accordion: propTypes.bool.def(true), - width: propTypes.string.def('100%'), - collapsedWidth: propTypes.string.def('48px'), - indentSize: propTypes.number.def(16), - collapse: propTypes.bool.def(true), - activeSubMenuNames: { - type: Array as PropType<(string | number)[]>, - default: () => [], - }, + const props = defineProps({ + theme: propTypes.oneOf(['light', 'dark']).def('light'), + activeName: propTypes.oneOfType([propTypes.string, propTypes.number]), + openNames: { + type: Array as PropType<string[]>, + default: () => [], }, - emits: ['select', 'open-change'], - setup(props, { emit }) { - const rootMenuEmitter = mitt(); - const instance = getCurrentInstance(); + accordion: propTypes.bool.def(true), + width: propTypes.string.def('100%'), + collapsedWidth: propTypes.string.def('48px'), + indentSize: propTypes.number.def(16), + collapse: propTypes.bool.def(true), + activeSubMenuNames: { + type: Array as PropType<(string | number)[]>, + default: () => [], + }, + }); - const currentActiveName = ref<string | number>(''); - const openedNames = ref<string[]>([]); + const emit = defineEmits(['select', 'open-change']); - const { prefixCls } = useDesign('menu'); + const rootMenuEmitter = mitt<MenuEmitterEvents>(); + const instance = getCurrentInstance(); - const isRemoveAllPopup = ref(false); + const currentActiveName = ref<string | number>(''); + const openedNames = ref<(string | number)[]>([]); - createSimpleRootMenuContext({ - rootMenuEmitter: rootMenuEmitter, - activeName: currentActiveName, + const { prefixCls } = useDesign('menu'); + + const isRemoveAllPopup = ref(false); + + createSimpleRootMenuContext({ + rootMenuEmitter: rootMenuEmitter, + activeName: currentActiveName, + }); + + const getClass = computed(() => { + const { theme } = props; + return [ + prefixCls, + `${prefixCls}-${theme}`, + `${prefixCls}-vertical`, + { + [`${prefixCls}-collapse`]: props.collapse, + }, + ]; + }); + + watchEffect(() => { + openedNames.value = props.openNames; + }); + + watchEffect(() => { + if (props.activeName) { + currentActiveName.value = props.activeName; + } + }); + + watch( + () => props.openNames, + () => { + nextTick(() => { + updateOpened(); }); + }, + ); - const getClass = computed(() => { - const { theme } = props; - return [ - prefixCls, - `${prefixCls}-${theme}`, - `${prefixCls}-vertical`, - { - [`${prefixCls}-collapse`]: props.collapse, - }, - ]; + function updateOpened() { + rootMenuEmitter.emit('on-update-opened', openedNames.value); + } + + function addSubMenu(name: string | number) { + if (openedNames.value.includes(name)) return; + openedNames.value.push(name); + updateOpened(); + } + + function removeSubMenu(name: string | number) { + openedNames.value = openedNames.value.filter((item) => item !== name); + updateOpened(); + } + + function removeAll() { + openedNames.value = []; + updateOpened(); + } + + function sliceIndex(index: number) { + if (index === -1) return; + openedNames.value = openedNames.value.slice(0, index + 1); + updateOpened(); + } + + provide<SubMenuProvider>(`subMenu:${instance?.uid}`, { + addSubMenu, + removeSubMenu, + getOpenNames: () => openedNames.value, + removeAll, + isRemoveAllPopup, + sliceIndex, + level: 0, + props: props as any, + }); + + onMounted(() => { + openedNames.value = !props.collapse ? [...props.openNames] : []; + updateOpened(); + rootMenuEmitter.on('on-menu-item-select', (name: string | number) => { + currentActiveName.value = name; + + nextTick(() => { + props.collapse && removeAll(); }); + emit('select', name); + }); - watchEffect(() => { - openedNames.value = props.openNames; - }); - - watchEffect(() => { - if (props.activeName) { - currentActiveName.value = props.activeName; - } - }); - - watch( - () => props.openNames, - () => { - nextTick(() => { - updateOpened(); - }); - }, - ); - - function updateOpened() { - rootMenuEmitter.emit('on-update-opened', openedNames.value); - } - - function addSubMenu(name: string) { - if (openedNames.value.includes(name)) return; + rootMenuEmitter.on('open-name-change', ({ name, opened }) => { + if (opened && !openedNames.value.includes(name)) { openedNames.value.push(name); - updateOpened(); + } else if (!opened) { + const index = openedNames.value.findIndex((item) => item === name); + index !== -1 && openedNames.value.splice(index, 1); } - - function removeSubMenu(name: string) { - openedNames.value = openedNames.value.filter((item) => item !== name); - updateOpened(); - } - - function removeAll() { - openedNames.value = []; - updateOpened(); - } - - function sliceIndex(index: number) { - if (index === -1) return; - openedNames.value = openedNames.value.slice(0, index + 1); - updateOpened(); - } - - provide<SubMenuProvider>(`subMenu:${instance?.uid}`, { - addSubMenu, - removeSubMenu, - getOpenNames: () => openedNames.value, - removeAll, - isRemoveAllPopup, - sliceIndex, - level: 0, - props: props as any, - }); - - onMounted(() => { - openedNames.value = !props.collapse ? [...props.openNames] : []; - updateOpened(); - rootMenuEmitter.on('on-menu-item-select', (name: string) => { - currentActiveName.value = name; - - nextTick(() => { - props.collapse && removeAll(); - }); - emit('select', name); - }); - - rootMenuEmitter.on('open-name-change', ({ name, opened }) => { - if (opened && !openedNames.value.includes(name)) { - openedNames.value.push(name); - } else if (!opened) { - const index = openedNames.value.findIndex((item) => item === name); - index !== -1 && openedNames.value.splice(index, 1); - } - }); - }); - - return { getClass, openedNames }; - }, + }); }); </script> <style lang="less"> -- Gitblit v1.9.3