Files
element-plus/docs/examples/dropdown/virtual-trigger.vue
vsqaq 6128e09e21 docs(components): [dropdown] example style adjustments (#23746)
* docs(components): [dropdown] example style adjustments

* docs(components): [dropdown] example style adjustments
2026-03-08 13:55:14 +08:00

84 lines
1.8 KiB
Vue

<template>
<el-card
class="content"
body-class="card-body"
@click="handleClick"
@contextmenu="handleContextmenu"
>
Right click
</el-card>
<el-dropdown
ref="dropdownRef"
:virtual-ref="triggerRef"
:show-arrow="false"
:popper-options="{
modifiers: [{ name: 'offset', options: { offset: [0, 0] } }],
}"
virtual-triggering
trigger="contextmenu"
placement="bottom-start"
>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item :icon="Plus">Action 1</el-dropdown-item>
<el-dropdown-item :icon="CirclePlusFilled"> Action 2 </el-dropdown-item>
<el-dropdown-item :icon="CirclePlus">Action 3</el-dropdown-item>
<el-dropdown-item :icon="Check">Action 4</el-dropdown-item>
<el-dropdown-item :icon="CircleCheck">Action 5</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</template>
<script lang="ts" setup>
import { ref } from 'vue'
import {
Check,
CircleCheck,
CirclePlus,
CirclePlusFilled,
Plus,
} from '@element-plus/icons-vue'
import type { DropdownInstance } from 'element-plus'
const dropdownRef = ref<DropdownInstance>()
const position = ref({
top: 0,
left: 0,
bottom: 0,
right: 0,
} as DOMRect)
const triggerRef = ref({
getBoundingClientRect: () => position.value,
})
const handleClick = () => {
dropdownRef.value?.handleClose()
}
const handleContextmenu = (event: MouseEvent) => {
const { clientX, clientY } = event
position.value = DOMRect.fromRect({
x: clientX,
y: clientY,
})
event.preventDefault()
dropdownRef.value?.handleOpen()
}
</script>
<style scoped>
.content {
display: flex;
justify-content: center;
align-items: center;
height: 200px;
}
.content :deep(.card-body) {
flex-grow: 0;
}
</style>