Skip to content

Commit 3351336

Browse files
authored
feat(dropdown): add contextmenu trigger support (#3861)
* feat(dropdown): add contextmenu trigger support * docs(dropdown): add version info for new contextmenu trigger
1 parent f34b552 commit 3351336

File tree

6 files changed

+62
-10
lines changed

6 files changed

+62
-10
lines changed

examples/sites/demos/apis/dropdown.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,16 +195,20 @@ export default {
195195
},
196196
{
197197
name: 'trigger',
198-
type: "'hover' | 'click'",
198+
type: "'hover' | 'click' | 'contextmenu'",
199199
defaultValue: "'hover'",
200200
desc: {
201201
'zh-CN': '触发下拉的方式',
202202
'en-US': 'Trigger the dropdown method'
203203
},
204204
mode: ['pc', 'mobile-first'],
205205
pcDemo: 'trigger',
206-
mfDemo: ''
206+
mfDemo: '',
207+
meta: {
208+
stable: '3.28.0'
209+
}
207210
},
211+
208212
{
209213
name: 'type',
210214
typeAnchorName: 'IButtonType',

examples/sites/demos/pc/app/dropdown/trigger-composition-api.vue

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,19 @@
2525
</tiny-dropdown-menu>
2626
</template>
2727
</tiny-dropdown>
28+
29+
<p>场景 3:设置右键触发下拉</p>
30+
<tiny-dropdown trigger="contextmenu">
31+
<template #dropdown>
32+
<tiny-dropdown-menu>
33+
<tiny-dropdown-item :icon="tinyIconPlus">黄金糕</tiny-dropdown-item>
34+
<tiny-dropdown-item :icon="tinyIconPlusCircle">狮子头</tiny-dropdown-item>
35+
<tiny-dropdown-item :icon="tinyIconPlusSquare">螺蛳粉</tiny-dropdown-item>
36+
<tiny-dropdown-item :icon="tinyIconCheckedLinear">双皮奶</tiny-dropdown-item>
37+
<tiny-dropdown-item :icon="tinyIconCheckedSur">蚵仔煎</tiny-dropdown-item>
38+
</tiny-dropdown-menu>
39+
</template>
40+
</tiny-dropdown>
2841
</div>
2942
</template>
3043

examples/sites/demos/pc/app/dropdown/trigger.spec.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ test('触发方式', async ({ page }) => {
99
const dropDownMenu = page.locator('body > .tiny-dropdown-menu')
1010
const hoverTrigger = dropDown.first()
1111
const clickTrigger = dropDown.nth(1)
12+
const contextTrigger = dropDown.nth(2)
1213

1314
// hover
1415
await page.waitForTimeout(2000)
@@ -20,4 +21,16 @@ test('触发方式', async ({ page }) => {
2021
await expect(dropDownMenu.nth(1)).not.toBeVisible()
2122
await clickTrigger.click()
2223
await expect(dropDownMenu.nth(1)).toBeVisible()
24+
25+
// contextmenu
26+
await page.waitForTimeout(2000)
27+
await contextTrigger.hover()
28+
await expect(dropDownMenu.nth(2)).not.toBeVisible()
29+
30+
// 右键触发
31+
await contextTrigger.click({
32+
button: 'right'
33+
})
34+
35+
await expect(dropDownMenu.nth(2)).toBeVisible()
2336
})

examples/sites/demos/pc/app/dropdown/trigger.vue

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,19 @@
2525
</tiny-dropdown-menu>
2626
</template>
2727
</tiny-dropdown>
28+
29+
<p>场景 3:设置右键触发下拉</p>
30+
<tiny-dropdown trigger="contextmenu">
31+
<template #dropdown>
32+
<tiny-dropdown-menu>
33+
<tiny-dropdown-item :icon="tinyIconPlus">黄金糕</tiny-dropdown-item>
34+
<tiny-dropdown-item :icon="tinyIconPlusCircle">狮子头</tiny-dropdown-item>
35+
<tiny-dropdown-item :icon="tinyIconPlusSquare">螺蛳粉</tiny-dropdown-item>
36+
<tiny-dropdown-item :icon="tinyIconCheckedLinear">双皮奶</tiny-dropdown-item>
37+
<tiny-dropdown-item :icon="tinyIconCheckedSur">蚵仔煎</tiny-dropdown-item>
38+
</tiny-dropdown-menu>
39+
</template>
40+
</tiny-dropdown>
2841
</div>
2942
</template>
3043

examples/sites/demos/pc/app/dropdown/webdoc/dropdown.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,9 @@ export default {
9393
},
9494
desc: {
9595
'zh-CN':
96-
'<p>通过 <code>trigger</code> 属性设置触发下拉的方式,默认为 <code>hover</code>。可选值为:<code>click</code> / <code>hover</code> 。</p>\n',
96+
'<p>通过 <code>trigger</code> 属性设置触发下拉的方式,默认为 <code>hover</code>。可选值为:<code>click</code> / <code>hover</code> / <code>contextmenu</code>(3.28.0 起支持)。</p>\n',
9797
'en-US':
98-
'<p>By setting the <code>trigger</code> attribute to trigger a drop-down, the default is <code>hover</code>. The optional values are: <code>click</code> / <code>hover</code>.</p>\n'
98+
'<p>Use the <code>trigger</code> attribute to set how the dropdown is triggered. Default is <code>hover</code>. Optional values: <code>click</code> / <code>hover</code> / <code>contextmenu</code> (supported since 3.28.0).</p>\n'
9999
},
100100
codeFiles: ['trigger.vue']
101101
},
@@ -108,7 +108,7 @@ export default {
108108
desc: {
109109
'zh-CN': '<p>通过 <code>visible</code> 属性手动控制下拉菜单显隐,优先级高于trigger。</p>\n',
110110
'en-US':
111-
'<p>Manually control the visibility of the dropdown menu through the<code>visible</code>attribute, with priority over trigger.</p>\n'
111+
'<p>Manually control the visibility of the dropdown menu through the <code>visible</code>attribute, with priority over trigger.</p>\n'
112112
},
113113
codeFiles: ['visible.vue']
114114
},
@@ -307,7 +307,7 @@ export default {
307307
support: {
308308
value: true
309309
},
310-
description: '支持点击和悬停两种触发方式。',
310+
description: '支持点击、悬停以及右键(contextmenu,3.28.0 起支持)触发方式。',
311311
cloud: {
312312
value: true
313313
},

packages/renderless/src/dropdown/index.ts

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ export const show =
5555
() => {
5656
state.visible = true
5757
},
58-
state.trigger === 'click' ? 0 : props.showTimeout
58+
state.trigger === 'click' || state.trigger === 'contextmenu' ? 0 : props.showTimeout
5959
)
6060
}
6161
}
@@ -82,7 +82,7 @@ export const hide =
8282
() => {
8383
state.visible = false
8484
},
85-
state.trigger === 'click' ? 0 : props.hideTimeout
85+
state.trigger === 'click' || state.trigger === 'contextmenu' ? 0 : props.hideTimeout
8686
)
8787
}
8888
}
@@ -127,7 +127,7 @@ export const handleItemKeyDown =
127127
({ api, props, state, emit }: Pick<IDropdownRenderlessParams, 'api' | 'props' | 'state' | 'emit'>) =>
128128
(event: KeyboardEvent) => {
129129
const keyCode = event.keyCode
130-
const target = event.target
130+
const target = event.target as HTMLElement
131131
const currentIndex = state.menuItemsArray.indexOf(target)
132132
const max = state.menuItemsArray.length - 1
133133

@@ -215,7 +215,15 @@ export const initEvent =
215215
return
216216
}
217217

218-
if (state.trigger === 'hover') {
218+
/** ---------------------------
219+
* 新增:右键触发 contextmenu
220+
* --------------------------- */
221+
if (state.trigger === 'contextmenu') {
222+
on(state.triggerElm, 'contextmenu', (e: MouseEvent) => {
223+
e.preventDefault()
224+
api.handleClick()
225+
})
226+
} else if (state.trigger === 'hover') {
219227
on(state.triggerElm, 'mouseenter', api.show)
220228
on(state.triggerElm, 'mouseleave', api.hide)
221229
on(state.dropdownElm, 'mouseenter', api.show)
@@ -302,6 +310,7 @@ export const beforeDistory =
302310
off(state.triggerElm, 'mouseenter', api.show)
303311
off(state.triggerElm, 'mouseleave', api.hide)
304312
off(state.triggerElm, 'click', api.handleClick)
313+
off(state.triggerElm, 'contextmenu', api.handleClick) /** 右键清理 */
305314
state.triggerElm = null
306315
}
307316

0 commit comments

Comments
 (0)