SplitButton 分隔按钮

如果项目中使用的是 0.x 版本的基础组件(@icedesign/base, @ali/ice, @alife/next),请在左侧导航顶部切换组件版本。

安装方法

  1. 在命令行中执行以下命令npm install @alifd/next@latest -S

使用指南

SplitButton 同样由 Button 和 Menu 组成,其在触发区域上可以分为两部分,其中 Icon 部分作为弹层菜单的触发区域。菜单只有在鼠标悬浮或点击右侧图标区域的时候才会展示。

API

SplitButton

参数说明类型默认值
size按钮组的尺寸可选值:'small', 'medium', 'large'Enum'medium'
type按钮的类型可选值:'normal', 'primary', 'secondary'Enum'normal'
label主按钮的文案ReactNode-
component设置标签类型可选值:'button', 'a'Enum-
ghost是否为幽灵按钮可选值:'light', 'dark', false, trueEnum-
defaultSelectedKeys默认激活的菜单项(用法同 Menu 非受控)Array[]
selectedKeys激活的菜单项(用法同 Menu 受控)Array-
selectMode菜单的选择模式可选值:'single', 'multiple'Enum-
onSelect选择菜单项时的回调,参考 Menu签名:Function() => voidFunctionfunc.noop
onItemClick点击菜单项时的回调,参考 Menu签名:Function() => voidFunctionfunc.noop
triggerProps触发按钮的属性(支持 Button 的所有属性透传)Object-
autoWidth弹层菜单的宽度是否与按钮组一致Booleantrue
visible弹层是否显示Boolean-
defaultVisible弹层默认是否显示Boolean-
onVisibleChange弹层显示状态变化时的回调函数签名:Function(visible: Boolean, type: String) => void参数:visible: {Boolean} 弹层显示状态type: {String} 触发弹层显示或隐藏的来源 menuSelect 表示由menu触发; fromTrigger 表示由trigger的点击触发; docClick 表示由document的点击触发Functionfunc.noop
popupTriggerType弹层的触发方式可选值:'click', 'hover'Enum'click'
popupAlign弹层对齐方式, 详情见Overlay alignString-
popupStyle弹层自定义样式Object-
popupClassName弹层自定义样式类String-
popupProps透传给弹层的属性Object-
followTrigger是否跟随滚动Boolean-
menuProps透传给 Menu 的属性Object{}
leftButtonProps透传给 左侧按钮 的属性Object{}

代码示例

基本

最简单的用法。支持 Button 的 type, size, component, ghost 等属性透传。

SplitButton 分隔按钮 - 图1

查看源码在线预览

  1. import { SplitButton } from '@alifd/next';
  2. const { Item } = SplitButton;
  3. const menu = ['Undo', 'Redo', 'Cut', 'Copy', 'Paste'].map(item => <Item key={item}>{item}</Item>);
  4. ReactDOM.render(<div>
  5. <SplitButton label="Edit Document">{menu}</SplitButton> &nbsp; &nbsp;
  6. <SplitButton label="Edit Document" type="primary">{menu}</SplitButton>&nbsp;&nbsp;
  7. <SplitButton label="Edit Document" type="secondary">{menu}</SplitButton><br /><br />
  8. </div>, mountNode);

尺寸

SplitButton 实际是上一个按钮组,通过 size 属性可以改变按钮组的大小。

SplitButton 分隔按钮 - 图2

查看源码在线预览

  1. import { SplitButton } from '@alifd/next';
  2. const { Item } = SplitButton;
  3. const menu = ['Undo', 'Redo', 'Cut', 'Copy', 'Paste'].map(item => <Item key={item}>{item}</Item>);
  4. ReactDOM.render(<div>
  5. <SplitButton label="Edit Document" size="small">{menu}</SplitButton> &nbsp; &nbsp;
  6. <SplitButton label="Edit Document" size="medium">{menu}</SplitButton> &nbsp; &nbsp;
  7. <SplitButton label="Edit Document" size="large">{menu}</SplitButton>
  8. </div>, mountNode);

复合使用

复合使用菜单,监听菜单行为。

SplitButton 分隔按钮 - 图3

查看源码在线预览

  1. import { SplitButton } from '@alifd/next';
  2. const { Item } = SplitButton;
  3. const menu = ['Undo', 'Redo', 'Cut', 'Copy', 'Paste'].map(item => <Item key={item}>{item}</Item>);
  4. class CompositeSplitButton extends React.Component {
  5. state = {
  6. visible: false,
  7. label: 'Choose Action'
  8. }
  9. onSelect = val => {
  10. this.setState({
  11. visible: false,
  12. label: val
  13. });
  14. }
  15. changeVisible = visible => {
  16. this.setState({
  17. visible
  18. });
  19. }
  20. render() {
  21. const { visible, label } = this.state;
  22. return (<SplitButton label={label} visible={visible} onVisibleChange={this.changeVisible} onItemClick={this.onSelect}>{menu}</SplitButton>);
  23. }
  24. }
  25. ReactDOM.render(<CompositeSplitButton />, mountNode);

复杂菜单

支持菜单组和菜单分割线,使用方法同 Menu.Group, Menu.Item, Menu.Divider

SplitButton 分隔按钮 - 图4

查看源码在线预览

  1. import { SplitButton } from '@alifd/next';
  2. const { Item, Group, Divider } = SplitButton;
  3. ReactDOM.render(<SplitButton label="Edit Document" onItemClick={key => console.log(key)}>
  4. <Item>Undo</Item>
  5. <Item>Redo</Item>
  6. <Divider />
  7. <Group>
  8. <Item helper="CTRL + X">Cut</Item>
  9. <Item helper="CTRL + C">Copy</Item>
  10. <Item helper="CTRL + V">Paste</Item>
  11. </Group>
  12. </SplitButton>, mountNode);

无障碍

为了使得屏幕阅读器能传达右侧按钮的含义,我们可以通过triggerProps传递对右侧按钮的aria-label描述,键盘操作请参考ARIA and KeyBoard

SplitButton 分隔按钮 - 图5

查看源码在线预览

  1. import { SplitButton } from '@alifd/next';
  2. const { Item } = SplitButton;
  3. const menu = ['Undo', 'Redo', 'Cut', 'Copy', 'Paste'].map(item => <Item key={item}>{item}</Item>);
  4. ReactDOM.render(<div>
  5. <SplitButton label="Edit Document" type="primary" triggerProps={{ 'aria-label': "click to see more menu option" }}>{menu}</SplitButton>
  6. </div>, mountNode);

相关区块

SplitButton 分隔按钮 - 图6

暂无相关区块