Skip to content

Dropdown 下拉菜单

下拉菜单组件,用于下拉操作菜单。

基础用法

html
<button id="demo-dropdown" class="sa-button sa-button--primary">下拉菜单</button>

<script>
  SA.init('body');
  const dropdown = new SaDropdown('#demo-dropdown', {
    trigger: 'click',
    menu: [
      { label: '选项一', onClick: () => alert('选项一') },
      { label: '选项二', onClick: () => alert('选项二') },
      { label: '选项三', onClick: () => alert('选项三') }
    ]
  });
</script>
加载 SanoUI 组件中...
            
          

不同触发方式

通过 trigger 配置触发方式。

html
<button id="demo-click">点击触发</button>
<button id="demo-hover">悬停触发</button>
<button id="demo-contextmenu">右键触发</button>

<script>
  // 点击触发
  new SaDropdown('#demo-click', {
    trigger: 'click',
    menu: [
      { label: '选项一', onClick: () => console.log('点击选项一') }
    ]
  });
  
  // 悬停触发
  new SaDropdown('#demo-hover', {
    trigger: 'hover',
    menu: [
      { label: '选项一', onClick: () => console.log('悬停选项一') }
    ]
  });
  
  // 右键触发
  new SaDropdown('#demo-contextmenu', {
    trigger: 'contextmenu',
    menu: [
      { label: '选项一', onClick: () => console.log('右键选项一') }
    ]
  });
</script>
加载 SanoUI 组件中...
            
          

带分割线

菜单项之间可以添加分割线。

html
<button id="demo-dropdown-divider" class="sa-button">带分割线的菜单</button>

<script>
  SA.init('body');
  const dropdown = new SaDropdown('#demo-dropdown-divider', {
    menu: [
      { label: '选项一', onClick: () => console.log('选项一') },
      { label: '选项二', onClick: () => console.log('选项二') },
      { type: 'divider' }, // 分割线
      { label: '选项三', onClick: () => console.log('选项三') }
    ]
  });
</script>
加载 SanoUI 组件中...
            
          

禁用项

某些菜单项可以设置为禁用状态。

html
<button id="demo-dropdown-disabled" class="sa-button">带禁用项的菜单</button>

<script>
  SA.init('body');
  const dropdown = new SaDropdown('#demo-dropdown-disabled', {
    menu: [
      { label: '可用选项', onClick: () => console.log('可用选项') },
      { label: '禁用选项', disabled: true }
    ]
  });
</script>
加载 SanoUI 组件中...
            
          

API

构造函数参数

参数说明类型默认值
container容器选择器或元素string | HTMLElement-
options配置选项SaDropdownOptions{}

配置选项

参数说明类型可选值默认值
trigger触发方式stringclick / hover / contextmenuclick
menu菜单项数组Array<DropdownMenuItem>-[]
placement菜单位置stringbottom / top / left / rightbottom
参数说明类型默认值
label菜单项文本string-
icon菜单项图标string-
disabled是否禁用booleanfalse
onClick点击回调function()-
type类型(用于分割线)string-

方法

方法名说明参数返回值
show显示下拉菜单-void
hide隐藏下拉菜单-void
destroy销毁实例-void

示例代码

手动创建实例

javascript
const dropdown = new SaDropdown('#my-dropdown', {
  trigger: 'click',
  placement: 'bottom',
  menu: [
    { label: '编辑', icon: 'edit', onClick: () => handleEdit() },
    { label: '删除', icon: 'delete', onClick: () => handleDelete() },
    { type: 'divider' },
    { label: '更多', disabled: true }
  ]
});

// 显示菜单
dropdown.show();

// 隐藏菜单
dropdown.hide();

实际使用场景

场景 1:表格操作菜单

在表格中使用下拉菜单提供更多操作选项。

html
<div id="table-with-menu" style="height: 200px;"></div>

<script>
  const table = new SaTable('#table-with-menu', {
    columns: [
      { field: 'name', label: '姓名', width: 120 },
      { field: 'email', label: '邮箱', width: 200 },
      {
        field: 'action',
        label: '操作',
        width: 150,
        render: (value, row) => {
          return `
            <button class="sa-button sa-button--text" id="menu-btn-${row.id}">
              更多操作 ▼
            </button>
          `;
        }
      }
    ],
    data: [
      { id: 1, name: '张三', email: 'zhangsan@example.com' },
      { id: 2, name: '李四', email: 'lisi@example.com' }
    ]
  });
  
  // 为每个操作按钮创建下拉菜单
  setTimeout(() => {
    [1, 2].forEach(id => {
      const btn = document.getElementById(`menu-btn-${id}`);
      if (btn) {
        new SaDropdown(btn, {
          trigger: 'click',
          menu: [
            { label: '查看', onClick: () => alert(`查看用户 ${id}`) },
            { label: '编辑', onClick: () => alert(`编辑用户 ${id}`) },
            { type: 'divider' },
            { label: '删除', onClick: () => {
              if (confirm('确定要删除吗?')) {
                alert(`删除用户 ${id}`);
              }
            } }
          ]
        });
      }
    });
  }, 100);
</script>
加载 SanoUI 组件中...
            
          

Released under the MIT License.