Dropdown 下拉菜单
向下弹出的列表。
组件注册
js
import { FDropdown } from '@fesjs/fes-design';
app.use(FDropdown);
代码演示
基础用法
简单的下拉菜单。
play
<template> <FDropdown arrow :options="options"> <FButton>下拉菜单</FButton> </FDropdown> </template> <script> export default { setup() { const options = [ { value: '1', label: '删除', disabled: true, }, { value: '2', label: '修改', }, { value: '3', label: '添加', }, { value: '4', label: '评论', }, { value: '5', label: '收藏', }, ]; return { options, }; }, }; </script>
选中效果
展示选中选项
play
<template> <FDropdown v-model="dropdownValue" arrow :options="options" showSelectedOption popperClass="dropdown-content-wrapper" @scroll="handleScroll" @click="handleClick" @change="handleChange" > <FButton>下拉菜单</FButton> </FDropdown> </template> <script setup> import { ref } from 'vue'; const dropdownValue = ref('3'); const options = [ { value: '1', label: '删除', disabled: true, }, { value: '2', label: '修改', }, { value: '3', label: '添加', }, { value: '4', label: '评论', }, { value: '5', label: '收藏', }, { value: '6', label: '点赞', }, { value: '7', label: '分享', }, { value: '8', label: '投诉', }, { value: '9', label: '建议', }, { value: '10', label: '更新', }, { value: '11', label: '编辑', }, { value: '12', label: '更多', }, ]; const handleScroll = (e) => { console.log('[dropdown.check] handleScroll, e:', e); }; const handleClick = (value) => { console.log('[dropdown.check] handleClick, value:', value); }; const handleChange = (value) => { console.log('[dropdown.check] handleChange, value:', value); }; </script> <style> .dropdown-content-wrapper .fes-dropdown-option-wrapper { max-height: 320px; } </style>
图标
菜单项可配置图标。
play
<template> <FDropdown :options="options"> <FButton>下拉菜单</FButton> </FDropdown> </template> <script> import { h } from 'vue'; import { DeleteOutlined, EditOutlined, PlusSquareOutlined, StarOutlined, UserOutlined, } from '@fesjs/fes-design/icon'; export default { setup() { const options = [ { value: '1', label: '删除', icon: () => { return h(DeleteOutlined); }, }, { value: '2', label: '修改', icon: () => { return h(EditOutlined); }, }, { value: '3', label: '添加', icon: () => { return h(PlusSquareOutlined); }, }, { value: '4', label: '评论', icon: () => { return h(UserOutlined); }, }, { value: '5', label: '收藏', icon: () => { return h(StarOutlined); }, }, ]; return { options, }; }, }; </script>
触发方式
触发下拉菜单弹出的行为有hover
、click
、focus
、contextmenu
play
<template> <FSpace> <FSelect v-model="trigger" style="width: 100px"> <FOption value="hover">hover</FOption> <FOption value="click">click</FOption> <FOption value="focus">focus</FOption> <FOption value="contextmenu">contextmenu</FOption> </FSelect> <FDropdown :trigger="trigger" :options="options"> <FButton>{{ trigger }}</FButton> </FDropdown> </FSpace> </template> <script> import { h, ref } from 'vue'; import { DeleteOutlined, EditOutlined, PlusSquareOutlined, StarOutlined, UserOutlined, } from '@fesjs/fes-design/icon'; export default { setup() { const trigger = ref('hover'); const options = [ { value: '1', label: '删除', icon: () => { return h(DeleteOutlined); }, }, { value: '2', label: '修改', icon: () => { return h(EditOutlined); }, }, { value: '3', label: '添加', icon: () => { return h(PlusSquareOutlined); }, }, { value: '4', label: '评论', icon: () => { return h(UserOutlined); }, }, { value: '5', label: '收藏', icon: () => { return h(StarOutlined); }, }, ]; return { trigger, options, }; }, }; </script>
弹出位置
弹出位置,可选auto
、auto-start
、auto-end
、top
、top-start
、top-end
、bottom
、bottom-start
、bottom-end
、right
、right-start
、right-end
、left
、left-start
、left-end
play
<template> <FSpace> <FDropdown placement="top" :options="options"> <FButton>top</FButton> </FDropdown> <FDropdown placement="bottom" :options="options"> <FButton>bottom</FButton> </FDropdown> <FDropdown placement="left" :options="options"> <FButton>left</FButton> </FDropdown> <FDropdown placement="right" :options="options"> <FButton>right</FButton> </FDropdown> </FSpace> </template> <script> import { h } from 'vue'; import { DeleteOutlined, EditOutlined, PlusSquareOutlined, StarOutlined, UserOutlined, } from '@fesjs/fes-design/icon'; export default { setup() { const options = [ { value: '1', label: '删除', icon: () => { return h(DeleteOutlined); }, }, { value: '2', label: '修改', icon: () => { return h(EditOutlined); }, }, { value: '3', label: '添加', icon: () => { return h(PlusSquareOutlined); }, }, { value: '4', label: '评论', icon: () => { return h(UserOutlined); }, }, { value: '5', label: '收藏', icon: () => { return h(StarOutlined); }, }, ]; return { options, }; }, }; </script>
禁用
下拉菜单无法弹出。
play
<template> <FDropdown disabled :options="options"> <FButton>hover</FButton> </FDropdown> </template> <script> export default { setup() { const options = [ { value: '1', label: '删除', disabled: true, }, { value: '2', label: '修改', }, { value: '3', label: '添加', }, { value: '4', label: '评论', }, { value: '5', label: '收藏', }, ]; return { options, }; }, }; </script>
Props
属性 | 说明 | 类型 | 默认值 |
---|---|---|---|
options | 下拉菜单选项配置 | Array<DropdownOption> | [] |
valueField | value 的属性名 | string | value |
labelField | label 的属性名 | string | label |
visible | 是否弹出 | boolean | false |
appendToContainer | 弹窗内容是否添加到指定的 DOM 元素 | boolean | true |
getContainer | 指定下拉选项挂载的 HTML 节点 | () => HTMLElement | () => document.body |
trigger | 触发弹窗的方式,可选hover 、click 、focus 、contextmenu | string | hover |
placement | 弹出位置,可选top 、top-start 、top-end 、bottom 、bottom-start 、bottom-end 、right 、right-start 、right-end 、left 、left-start 、left-end | string | bottom |
offset | 下拉菜单弹窗距离触发元素的距离,单位 px | number | 6 |
disabled | 是否禁用 | boolean | false |
arrow | 是否显示箭头 | boolean | false |
showSelectedOption | 是否显示选中选项 | boolean | false |
popperClass | 弹出框容器样式 | string | - |
Events
事件名称 | 说明 | 回调参数 |
---|---|---|
click | 点击选项的回调 | (value) => void |
visibleChange | 菜单显示状态改变时调用 | (visible: Boolean) => void |
scroll | 滚动事件 | (event: Event) => void |
Slots
名称 | 说明 |
---|---|
default | 触发下拉菜单的内容 |
DropdownOption
属性 | 说明 | 类型 | 默认值 |
---|---|---|---|
value | 节点的 key ,需要唯一,可使用 valueField 修改字段名 | string | number | - |
label | 节点的内容,可使用 labelField 修改字段名 | string | (item) => VNodeChild | - |
disabled? | 是否禁用节点 | boolean | false |
icon? | 节点的图标 | () => VNodeChild | null |