Skip to content

Dropdown

A dropdown menu component based on Tooltip, used to display options triggered by click or hover.

Basic Usage

<script setup>
import { ref } from 'vue'
import Dropdown from '@/components/Dropdown/Dropdown.vue'
import Button from '@/components/Button/Button.vue'
const options = ref([
  { key: 1, label: 'Edit' },
  { key: 2, label: 'Copy' },
  { key: 3, label: 'Delete' }
])
</script>

<template>
  <Dropdown :menuOption="options" trigger="click">
    <template #default>
      <Button>Actions</Button>
    </template>
  </Dropdown>
</template>

Hover Trigger

<script setup>
import { ref } from 'vue'
import Dropdown from '@/components/Dropdown/Dropdown.vue'
import Button from '@/components/Button/Button.vue'
const options = ref([
  { key: 1, label: 'Profile' },
  { key: 2, label: 'Settings' }
])
</script>

<template>
  <Dropdown :menuOption="options" trigger="hover">
    <template #default>
      <Button>Hover me</Button>
    </template>
  </Dropdown>
</template>

Disabled & Divided

<script setup>
import { ref } from 'vue'
import Dropdown from '@/components/Dropdown/Dropdown.vue'
import Button from '@/components/Button/Button.vue'
const options = ref([
  { key: 1, label: 'Normal item' },
  { key: 2, label: 'Disabled item', disabled: true },
  { key: 3, label: 'With divider', divided: true }
])
</script>

<template>
  <Dropdown :menuOption="options">
    <template #default>
      <Button>Options</Button>
    </template>
  </Dropdown>
</template>

Manual Control

<script setup>
import { ref } from 'vue'
import Dropdown from '@/components/Dropdown/Dropdown.vue'
import Button from '@/components/Button/Button.vue'

const dropdownRef = ref()
const options = ref([
    { key: 1, label: 'Option 1' },
    { key: 2, label: 'Option 2' }
])
</script>

<template>
    <Dropdown ref="dropdownRef" :menuOption="options" placement="top" manual>
        <template #default>
            <Button>Manual Control</Button>
        </template>
    </Dropdown>
    <div class="demo-manual">
        <Button type="success" @click="dropdownRef?.show()">Show</Button>
        <Button type="danger" @click="dropdownRef?.hide()">Hide</Button>
    </div>

</template>

<style scoped>
.demo-manual {
    display: flex;
    margin-top: 10px;
}
</style>

NameDescriptionTypeDefault
menuOptionoptions list to renderMenuOption[][]
triggerhow to trigger dropdown (click / hover)string'click'
placementposition of the dropdownPlacement (top-end, etc)'bottom'
popperOptionspopper.js optionsPartial<Options>{}
openDelaydelay in ms before showingnumber0
closeDelaydelay in ms before hidingnumber200
manualwhether to manually control visibilitybooleanfalse
hideAfterClickwhether to hide after clicking an itembooleantrue

NameDescriptionType
selectemitted when an item is selected(item: MenuOption) => void
visible-changeemitted when visibility changes(visible: boolean) => void

Exposed Methods

You can use ref to access the dropdown instance and call these methods:

MethodDescription
show()show the dropdown
hide()hide the dropdown

Type Definition

ts
export interface MenuOption {
  key: string | number
  label: VNode | string
  disabled?: boolean
  divided?: boolean
}

export interface DropdownInstance {
  show: () => void
  hide: () => void
}