返回 slidev
MenuButton.vue
根目录 / packages / client / internals / MenuButton.vue
1 <script setup lang="ts">
2 import { onClickOutside, useVModel } from '@vueuse/core'
3 import { ref } from 'vue'
4
5 const props = defineProps({
6 modelValue: {
7 default: false,
8 },
9 disabled: {
10 default: false,
11 },
12 })
13
14 const emit = defineEmits<{
15 (e: any): void
16 }>()
17 const value = useVModel(props, 'modelValue', emit, { passive: true })
18 const el = ref<HTMLDivElement>()
19
20 onClickOutside(el, () => {
21 value.value = false
22 })
23 </script>
24
25 <template>
26 <div ref="el" class="flex relative">
27 <button :class="{ disabled }" @click="value = !value">
28 <slot name="button" :value :class="{ disabled }" />
29 </button>
30 <KeepAlive>
31 <div
32 v-if="value"
33 class="bg-main text-main shadow-xl absolute bottom-10 left-0 z-menu py2"
34 border="~ main rounded-md"
35 >
36 <slot name="menu" />
37 </div>
38 </KeepAlive>
39 </div>
40 </template>
41
41 lines Plain Text