Dropdown 下拉菜单
一、概述
定义
向下弹出的操作或菜单的浮层。
使用场景
将操作或菜单折叠到下拉菜单中。
需要进一步进行操作时
类型
基础样式
分类样式
二、 基础样式
鼠标移动到下拉按钮上,展开下拉菜单。
<template>
<se-dropdown>
<div class="se-dropdown-link">
hover me
<i class="se-dropdown-icon--down">
<svg
viewBox="64 64 896 896"
focusable="false"
class=""
data-icon="down"
width="1em"
height="1em"
fill="currentColor"
aria-hidden="true"
>
<path
d="M884 256h-75c-5.1 0-9.9 2.5-12.9 6.6L512 654.2 227.9 262.6c-3-4.1-7.8-6.6-12.9-6.6h-75c-6.5 0-10.3 7.4-6.5 12.7l352.6 486.1c12.8 17.6 39 17.6 51.7 0l352.6-486.1c3.9-5.3.1-12.7-6.4-12.7z"
></path>
</svg>
</i>
</div>
<se-dropdown-menu slot="menu">
<se-dropdown-item v-for="item in 5" :key="item">
{{item}}st menu item
</se-dropdown-item>
</se-dropdown-menu>
</se-dropdown>
</template>
<style>
.se-dropdown-link {
color: #01d567;
outline: none;
cursor: pointer;
}
.se-dropdown-icon--down {
display: inline-block;
font-size: 12px;
vertical-align: -0.2em;
}
</style>
三、 分组
可以通过添加分割线进行分组。
<template>
<se-dropdown>
<div class="se-dropdown-link">
hover me
<i class="se-dropdown-icon--down">
<svg
viewBox="64 64 896 896"
focusable="false"
class=""
data-icon="down"
width="1em"
height="1em"
fill="currentColor"
aria-hidden="true"
>
<path
d="M884 256h-75c-5.1 0-9.9 2.5-12.9 6.6L512 654.2 227.9 262.6c-3-4.1-7.8-6.6-12.9-6.6h-75c-6.5 0-10.3 7.4-6.5 12.7l352.6 486.1c12.8 17.6 39 17.6 51.7 0l352.6-486.1c3.9-5.3.1-12.7-6.4-12.7z"
></path>
</svg>
</i>
</div>
<se-dropdown-menu slot="menu">
<se-dropdown-item v-for="item in 5" :key="item" :divided="item === 3">
{{item}}st menu item
</se-dropdown-item>
</se-dropdown-menu>
</se-dropdown>
</template>
<style>
.se-dropdown-link {
color: #01d567;
outline: none;
cursor: pointer;
}
.se-dropdown-icon--down {
display: inline-block;
font-size: 12px;
vertical-align: -0.2em;
}
</style>
四、 触发方式
可以配置 click | hover 激活。
<template>
<se-dropdown>
<div class="se-dropdown-link">
hover me
<i class="se-dropdown-icon--down">
<svg
viewBox="64 64 896 896"
focusable="false"
class=""
data-icon="down"
width="1em"
height="1em"
fill="currentColor"
aria-hidden="true"
>
<path
d="M884 256h-75c-5.1 0-9.9 2.5-12.9 6.6L512 654.2 227.9 262.6c-3-4.1-7.8-6.6-12.9-6.6h-75c-6.5 0-10.3 7.4-6.5 12.7l352.6 486.1c12.8 17.6 39 17.6 51.7 0l352.6-486.1c3.9-5.3.1-12.7-6.4-12.7z"
></path>
</svg>
</i>
</div>
<se-dropdown-menu slot="menu">
<se-dropdown-item v-for="item in 5" :key="item">
{{item}}st menu item
</se-dropdown-item>
</se-dropdown-menu>
</se-dropdown>
<se-dropdown trigger="click">
<div class="se-dropdown-link">
click me
<i class="se-dropdown-icon--down">
<svg
viewBox="64 64 896 896"
focusable="false"
class=""
data-icon="down"
width="1em"
height="1em"
fill="currentColor"
aria-hidden="true"
>
<path
d="M884 256h-75c-5.1 0-9.9 2.5-12.9 6.6L512 654.2 227.9 262.6c-3-4.1-7.8-6.6-12.9-6.6h-75c-6.5 0-10.3 7.4-6.5 12.7l352.6 486.1c12.8 17.6 39 17.6 51.7 0l352.6-486.1c3.9-5.3.1-12.7-6.4-12.7z"
></path>
</svg>
</i>
</div>
<se-dropdown-menu slot="menu">
<se-dropdown-item v-for="item in 5" :key="item">
{{item}}st menu item
</se-dropdown-item>
</se-dropdown-menu>
</se-dropdown>
</template>
<style>
.se-dropdown-link {
margin-right: 20px;
color: #01d567;
outline: none;
cursor: pointer;
}
.se-dropdown-icon--down {
display: inline-block;
font-size: 12px;
vertical-align: -0.2em;
}
</style>
五、 不同位置
根据使用场景,提供 6 种不同方向。
<template>
<div v-for="(item, key) in directions" :class="key" :key="key">
<se-dropdown v-for="dir in item" :key="dir[0]" :placement="dir[0]">
<div class="se-dropdown-link">
{{dir[1]}}
</div>
<se-dropdown-menu slot="menu">
<se-dropdown-item v-for="item in 5" :key="item">
{{item}}st menu item
</se-dropdown-item>
</se-dropdown-menu>
</se-dropdown>
</div>
</template>
<script>
export default {
data() {
return {
directions: {
top: [['top-left', '上左'], ['top', '上中'], ['top-right', '上右']],
bottom: [['bottom-left', '下左'], ['bottom', '下中'], ['bottom-right', '下右']]
}
}
}
}
</script>
<style>
.se-dropdown-link {
color: #01d567;
outline: none;
outline: none;
cursor: pointer;
}
.se-dropdown-icon--down {
display: inline-block;
font-size: 12px;
vertical-align: -0.2em;
}
.se-dropdown {
margin: 10px;
}
</style>
六、 菜单隐藏方式
通过 hide-on-click 属性的配置来控制是否点击菜单任意项后隐藏菜单,将 hide-on-click 属性默认为 false 可以关闭此功能。
<template>
<se-dropdown :hideOnClick="hideOnClick">
<div class="se-dropdown-link">
hover me
<i class="se-dropdown-icon--down">
<svg
viewBox="64 64 896 896"
focusable="false"
class=""
data-icon="down"
width="1em"
height="1em"
fill="currentColor"
aria-hidden="true"
>
<path
d="M884 256h-75c-5.1 0-9.9 2.5-12.9 6.6L512 654.2 227.9 262.6c-3-4.1-7.8-6.6-12.9-6.6h-75c-6.5 0-10.3 7.4-6.5 12.7l352.6 486.1c12.8 17.6 39 17.6 51.7 0l352.6-486.1c3.9-5.3.1-12.7-6.4-12.7z"
></path>
</svg>
</i>
</div>
<se-dropdown-menu slot="menu">
<se-dropdown-item v-for="item in 5" :key="item">
{{item}}st menu item
</se-dropdown-item>
</se-dropdown-menu>
</se-dropdown>
</template>
<script>
export default {
data() {
return {
hideOnClick: false
}
}
}
</script>
<style>
.se-dropdown-link {
color: #01d567;
outline: none;
cursor: pointer;
}
.se-dropdown-icon--down {
display: inline-block;
font-size: 12px;
vertical-align: -0.2em;
}
</style>
七、 初始化显示状态
组件内部默认维护了一个控制显示隐藏的状态。当然,你也可以通过 visible 属性自行控制。
<template>
<div style="height: 220px">
<se-dropdown :visible="true">
<div class="se-dropdown-link">
hover me
<i class="se-dropdown-icon--down">
<svg
viewBox="64 64 896 896"
focusable="false"
class=""
data-icon="down"
width="1em"
height="1em"
fill="currentColor"
aria-hidden="true"
>
<path
d="M884 256h-75c-5.1 0-9.9 2.5-12.9 6.6L512 654.2 227.9 262.6c-3-4.1-7.8-6.6-12.9-6.6h-75c-6.5 0-10.3 7.4-6.5 12.7l352.6 486.1c12.8 17.6 39 17.6 51.7 0l352.6-486.1c3.9-5.3.1-12.7-6.4-12.7z"
></path>
</svg>
</i>
</div>
<se-dropdown-menu slot="menu">
<se-dropdown-item v-for="item in 5" :key="item">
{{item}}st menu item
</se-dropdown-item>
</se-dropdown-menu>
</se-dropdown>
</div>
</template>
<style>
.se-dropdown-link {
color: #01d567;
outline: none;
cursor: pointer;
}
.se-dropdown-icon--down {
display: inline-block;
font-size: 12px;
vertical-align: -0.2em;
}
</style>
八、 事件与状态同步
当 dropdown-menu 的展示状态发生变化时(理论上),我们会向外 emit 一个 visibilityChange 事件。
<template>
<se-dropdown @visibility-change="visibilityChange">
<div class="se-dropdown-link">
hover me
<i class="se-dropdown-icon--down">
<svg
viewBox="64 64 896 896"
focusable="false"
class=""
data-icon="down"
width="1em"
height="1em"
fill="currentColor"
aria-hidden="true"
>
<path
d="M884 256h-75c-5.1 0-9.9 2.5-12.9 6.6L512 654.2 227.9 262.6c-3-4.1-7.8-6.6-12.9-6.6h-75c-6.5 0-10.3 7.4-6.5 12.7l352.6 486.1c12.8 17.6 39 17.6 51.7 0l352.6-486.1c3.9-5.3.1-12.7-6.4-12.7z"
></path>
</svg>
</i>
</div>
<se-dropdown-menu slot="menu">
<se-dropdown-item v-for="item in 5" :key="item">
{{item}}st menu item
</se-dropdown-item>
</se-dropdown-menu>
</se-dropdown>
</template>
<script>
export default {
data() {
return {
visibleArrow: false,
tabindex: 1
}
},
methods: {
visibilityChange(visibility) {
console.log(visibility)
}
}
}
</script>
<style>
.se-dropdown-link {
color: #01d567;
outline: none;
cursor: pointer;
}
.se-dropdown-icon--down {
display: inline-block;
font-size: 12px;
vertical-align: -0.2em;
}
</style>
另外,还可以使用 sync 修饰符实现状态自动同步。
<template>
<se-dropdown :visible_sync="visible">
<div class="se-dropdown-link">
hover me
<i class="se-dropdown-icon--down">
<svg
viewBox="64 64 896 896"
focusable="false"
class=""
data-icon="down"
width="1em"
height="1em"
fill="currentColor"
aria-hidden="true"
>
<path
d="M884 256h-75c-5.1 0-9.9 2.5-12.9 6.6L512 654.2 227.9 262.6c-3-4.1-7.8-6.6-12.9-6.6h-75c-6.5 0-10.3 7.4-6.5 12.7l352.6 486.1c12.8 17.6 39 17.6 51.7 0l352.6-486.1c3.9-5.3.1-12.7-6.4-12.7z"
></path>
</svg>
</i>
</div>
<se-dropdown-menu slot="menu">
<se-dropdown-item v-for="item in 5" :key="item">
{{item}}st menu item
</se-dropdown-item>
</se-dropdown-menu>
</se-dropdown>
</template>
<script>
export default {
data() {
return {
visible: false
}
}
}
</script>
<style>
.se-dropdown-link {
color: #01d567;
outline: none;
cursor: pointer;
}
.se-dropdown-icon--down {
display: inline-block;
font-size: 12px;
vertical-align: -0.2em;
}
</style>
Props
属性 | 类型 | 默认值 | 必填 | 说明 |
---|---|---|---|---|
visible | boolean | 否 | 下拉菜单的默认展现方式 (出现/隐藏) | |
trigger | string | hover / click | 否 | 触发下拉的⾏为 |
hide-on-click | boolean | true | 否 | 是否在点击菜单项后隐藏菜单 |
show-delay | number | 100 | 否 | 下拉菜单出现的延迟 |
hide-delay | number | 100 | 否 | 下拉菜单消失的延迟 |
tabindex | 0 | 否 | 下拉菜单按钮的 tabindex | |
visible-arrow | boolean | true | 否 | 是否显示 Menu 箭头 |
placement | string | bottom-left | 否 | 位置 |
位置可选值
const placementTypes = ['top-left', 'top', 'top-right', 'bottom-right', 'bottom', 'bottom-left']
DropDown Events
事件名称 | 描述 | 回调函数参数 |
---|---|---|
visibility-change | 下拉菜单出现/隐藏时触发 | true / false |
item-click | 点击菜单项触发 | value |
DropDown-Item Props
属性 | 类型 | 默认值 | 必填 | 说明 |
---|---|---|---|---|
value | string / object / number | 否 | 菜单项目绑定的值 | |
divided | boolean | false | 否 | 分割线 |