Skip to content

Commit f156656

Browse files
authored
feat: add appendTo prop to DropdownMenu (#137)
1 parent 33a96d4 commit f156656

File tree

5 files changed

+24
-15
lines changed

5 files changed

+24
-15
lines changed

docs/demos/dropdown-menu/basic.vue

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,12 @@
1818
</TrDropdownMenu>
1919
<hr />
2020
<div style="display: flex; gap: 10px">
21-
<TrDropdownMenu :items="dropdownMenuItems" trigger="hover" @item-click="(item) => console.log(item)">
21+
<TrDropdownMenu
22+
:items="dropdownMenuItems"
23+
trigger="hover"
24+
@item-click="(item) => console.log(item)"
25+
append-to="#app"
26+
>
2227
<template #trigger>
2328
<TrSuggestionPillButton> Trigger 为 hover </TrSuggestionPillButton>
2429
</template>

docs/src/components/dropdown-menu.md

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,12 @@ outline: deep
1818

1919
下拉菜单属性配置。
2020

21-
| 属性 | 类型 | 默认值 | 说明 |
22-
| --------- | -------------------------------- | --------- | ----------------------------------------------- |
23-
| `items` | `DropdownMenuItem[]` | - | **必填**,菜单项数据数组 |
24-
| `show` | `boolean` | - | 是否显示菜单(仅在 trigger 为 'manual' 时有效) |
25-
| `trigger` | `'click' \| 'hover' \| 'manual'` | `'click'` | 触发方式:点击、悬停或手动控制 |
21+
| 属性 | 类型 | 默认值 | 说明 |
22+
| ---------- | -------------------------------- | --------------------------------- | ------------------------------------------------- |
23+
| `appendTo` | `string \| HTMLElement` | `'body'` 或者 shadow dom 的根节点 | 菜单挂载的目标容器 |
24+
| `items` | `DropdownMenuItem[]` | - | **必填**,菜单项数据数组 |
25+
| `show` | `boolean` | - | 是否显示菜单,仅在 `trigger``'manual'` 时有效 |
26+
| `trigger` | `'click' \| 'hover' \| 'manual'` | `'click'` | 菜单触发方式:点击、悬停或手动控制 |
2627

2728
### Slots
2829

@@ -36,21 +37,21 @@ outline: deep
3637

3738
下拉菜单事件定义。
3839

39-
| 事件名 | 参数 | 说明 |
40-
| --------------- | ------------------------ | -------------------------------------------------------------------- |
41-
| `item-click` | `item: DropdownMenuItem` | 点击菜单项时触发 |
42-
| `click-outside` | `event: MouseEvent` | 点击菜单外部区域时触发(仅在 trigger 为 'click' 或 'manual' 时有效) |
40+
| 事件名 | 参数 | 说明 |
41+
| --------------- | ------------------------ | -------------------------------------------------------------------------- |
42+
| `item-click` | `item: DropdownMenuItem` | 点击菜单项时触发 |
43+
| `click-outside` | `event: MouseEvent` | 点击菜单外部区域时触发(仅在 `trigger``'click'``'manual'` 时有效) |
4344

4445
### Types
4546

4647
#### DropdownMenuItem
4748

4849
菜单项数据结构。
4950

50-
| 属性 | 类型 | 说明 |
51-
| ------ | -------- | ---------- |
52-
| `id` | `string` | 项唯一标识 |
53-
| `text` | `string` | 显示文本 |
51+
| 属性 | 类型 | 说明 |
52+
| ------ | -------- | -------------- |
53+
| `id` | `string` | 菜单项唯一标识 |
54+
| `text` | `string` | 菜单项显示文本 |
5455

5556
### CSS Variables
5657

packages/components/src/base-popper/index.vue

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ type TriggerEvents = Partial<Record<`on${Capitalize<string>}`, (...args: any[])
2323
2424
const props = withDefaults(
2525
defineProps<{
26+
appendTo?: string | HTMLElement
2627
offset?: number | { mainAxis?: number; crossAxis?: number }
2728
placement?: 'top-center' | 'bottom-center' | 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right'
2829
preventOverflow?: boolean
@@ -179,7 +180,7 @@ defineExpose({
179180
v-bind="indexedEventHandlers[index]"
180181
/>
181182
<Transition v-bind="transitionProps">
182-
<Teleport v-if="show" :to="teleportTarget">
183+
<Teleport v-if="show" :to="props.appendTo || teleportTarget">
183184
<div class="tr-base-popper" ref="popperRef" :style="popperStyles" v-bind="$attrs">
184185
<slot name="content" />
185186
</div>

packages/components/src/dropdown-menu/index.type.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ export interface DropdownMenuItem {
66
}
77

88
export interface DropdownMenuProps {
9+
appendTo?: string | HTMLElement
910
items: DropdownMenuItem[]
1011
/**
1112
* 是否显示菜单,仅在 trigger 为 'manual' 时有效

packages/components/src/dropdown-menu/index.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ const handleItemClick = (item: DropdownMenuItem) => {
7575
class="tr-dropdown-menu"
7676
ref="basePopperRef"
7777
placement="top-left"
78+
:append-to="props.appendTo"
7879
:offset="8"
7980
:transition-props="{ name: 'tr-dropdown-menu' }"
8081
:prevent-overflow="true"

0 commit comments

Comments
 (0)