Menu 菜单

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

安装方法

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

API

菜单

参数说明类型默认值
prefix样式类名的品牌前缀String'next-'
className自定义类名String-
style自定义内联样式Object-
selectedKeys当前选中的菜单项, 设置此属性,组件的选中变为受控状态Array/ReactNode-
defaultSelectedKeys初始化选中的菜单项,只在组件初次render的时候生效Array/ReactNode[]
selectMode菜单选择的模式,支持单选和多选可选值:'single', 'multiple'Enum-
openKeys当前打开的菜单项,设置此属性,组件的打开变为受控状态Array/ReactNode-
defaultOpenKeys初始化打开的菜单项,只在组件初次render的时候生效Array/ReactNode[]
openMode子菜单同时打开模式,是多个还是一个可选值:'single', 'multiple'Enum'multiple'
shallowSelect如果此属性为true,表明只会选中第一级的菜单Boolean-
onSelect选中/取消选中了任意MenuItem签名:Function(selectedKeys: Array, menuItem: MenuItem, meta: Object) => void参数:selectedKeys: {Array} 选中的菜单的keymenuItem: {MenuItem} 当前点击的菜单项的实例meta: {Object} 选中菜单项的上下级关系Function() => {}
onDeselect取消选中的菜单项签名:Function(selectedKey: String) => void参数:selectedKey: {String} 取消选中的菜单项的keyFunction() => {}
onClick点击菜单项触发的事件签名:Function(selectedKeys: Array, menuItem: MenuItem, meta: Object) => void参数:selectedKeys: {Array} 点击的菜单项的keymenuItem: {MenuItem} 当前点击的菜单项的实例meta: {Object} 选中菜单项的上下级关系Function() => {}
onOpen打开子菜单的时候触发的事件签名:Function(openKeys: Array) => void参数:openKeys: {Array} 打开的子菜单的keyFunction() => {}
hasIcon是否带有菜单的图标Booleanfalse
indentSize级联菜单下面缩进的尺寸Number20
header配置菜单的头部any-
footer配置菜单的底部any-
multipleCol是否启用多列模式Booleanfalse
autoFocusFirstItem是否让第一个菜单自动获取焦点Booleanfalse
autoFocus是否启用设置焦点功能Booleantrue
focusedKey焦点项索引值String-
direction菜单的方向可选值:'ver', 'hoz'Enum'ver'

Menu.CheckboxItem

参数说明类型默认值
prefix样式类名的品牌前缀String'next-'
className自定义类名String-
style自定义内联样式Object-
helper显示在菜单右侧的帮助文本,通常用于一些附加信息Stringnull
disabled禁用当前菜单项, 被禁用不会触发事件, 也无法选中Checkbox/RadioBooleanfalse
onClick点击了菜单项触发的事件签名:Function(key: String, e: Event) => void参数:key: {String} 当前菜单项的key值e: {Event} DOM事件Function() => {}
needIndent是否显示缩进Booleantrue
checked当前的菜单项是否被选中, 优先级比Menu传入的selectedKeys要高Boolean-
onChange选择被改变的时候触发的事件签名:Function(checked: Boolean) => void参数:checked: {Boolean} 是否选中Function() => {}

Menu.Divider

参数说明类型默认值
prefix样式类名的品牌前缀String'next-'

Menu.Group

参数说明类型默认值
prefix样式类名的品牌前缀String'next-'
label分组的标签any'menu-group'

Menu.Item

参数说明类型默认值
prefix样式类名的品牌前缀String'next-'
className自定义类名String-
style自定义内联样式Object-
helper显示在菜单右侧的帮助文本,通常用于一些附加信息Stringnull
disabled禁用当前菜单项, 被禁用不会触发事件, 也无法选中Checkbox/RadioBooleanfalse
selected当前的菜单项是否被选中, 优先级比Menu传入的selectedKeys要高Boolean-
onClick点击了菜单项触发的事件签名:Function(key: String, e: Event) => void参数:key: {String} 当前菜单项的key值e: {Event} DOM事件Function() => {}
hasSelectedIcon是否显示选中图标Booleantrue
needIndent是否显示缩进Booleantrue

Menu.PopupItem

参数说明类型默认值
prefix样式类名的品牌前缀String'next-'
className自定义类名String-
style自定义内联样式Object-
disabled禁用当前菜单项, 被禁用不会触发事件Booleanfalse
label菜单项的标签any'popup-item'
autoWidth是否自动让弹出层的宽度和菜单项保持一致,逻辑是如果弹出层的宽度比菜单项小的话和菜单项保持一致,如果宽度大于菜单项则不做处理Booleanfalse

Menu.RadioItem

参数说明类型默认值
prefix样式类名的品牌前缀String'next-'
className自定义类名String-
style自定义内联样式Object-
helper显示在菜单右侧的帮助文本,通常用于一些附加信息Stringnull
disabled禁用当前菜单项, 被禁用不会触发事件, 也无法选中Checkbox/RadioBooleanfalse
onClick点击了菜单项触发的事件签名:Function(key: String, e: Event) => void参数:key: {String} 当前菜单项的key值e: {Event} DOM事件Function() => {}
needIndent是否显示缩进Booleantrue
checked当前的菜单项是否被选中, 优先级比Menu传入的selectedKeys要高Boolean-
onChange选择被改变的时候触发的事件签名:Function(checked: Boolean) => void参数:checked: {Boolean} 是否选中Function() => {}

Menu.SubMenu

参数说明类型默认值
prefix样式类名的品牌前缀String'next-'
className自定义类名String-
label子菜单的标签any'sub-item'
visible设置子菜单的显示状态Boolean-
mode设置子菜单表现的形式可选值:'inline', 'popup'Enum'inline'
triggerType设置子菜单显示触发的类型可选值:'click', 'hover'Enum'click'
selectable设置子菜单的label是否可以被选中Booleanfalse
align设置子菜单的跟随类型可选值:'outside', 'follow'Enum'follow'

方法

签名:Function() => mixed返回值:{mixed} null

签名:Function() => mixed返回值:{mixed} null

签名:Function() => mixed返回值:{mixed} null

代码示例

基本

最简单的用法

Menu 菜单 - 图1

查看源码在线预览

  1. import { Menu } from "@icedesign/base";
  2. const onClick = (...args) => {
  3. console.log(...args);
  4. };
  5. ReactDOM.render(
  6. <Menu onClick={onClick} className="customize-limit">
  7. <Menu.Item key="1">Option 1</Menu.Item>
  8. <Menu.Item disabled key="2">
  9. Option 2
  10. </Menu.Item>
  11. <Menu.Divider key="d" />
  12. <Menu.SubMenu label="Sub Menu">
  13. <Menu.Item>Option 3</Menu.Item>
  14. </Menu.SubMenu>
  15. <Menu.Item>Option 4</Menu.Item>
  16. </Menu>,
  17. mountNode
  18. );
  1. .customize-limit {
  2. width: 200px;
  3. }

分组

分组菜单

Menu 菜单 - 图2

查看源码在线预览

  1. import { Menu } from "@icedesign/base";
  2. const onClick = (...args) => {
  3. console.log(...args);
  4. };
  5. ReactDOM.render(
  6. <Menu onClick={onClick} className="customize-limit">
  7. <Menu.Group label="Group 1" key="xxx">
  8. <Menu.Item key="1">Option 1</Menu.Item>
  9. <Menu.Item key="2">Option 2</Menu.Item>
  10. <Menu.Item key="3">Option 3</Menu.Item>
  11. </Menu.Group>
  12. <Menu.Group label="Group 2" key="xyz">
  13. <Menu.Item key="12">Option 1</Menu.Item>
  14. <Menu.Item key="22">Option 2</Menu.Item>
  15. <Menu.Item key="32">Option 3</Menu.Item>
  16. </Menu.Group>
  17. </Menu>,
  18. mountNode
  19. );
  1. .customize-limit {
  2. width: 200px;
  3. }

头尾

可以设置菜单的头尾

Menu 菜单 - 图3

查看源码在线预览

  1. import { Menu } from "@icedesign/base";
  2. const onClick = (...args) => {
  3. console.log(...args);
  4. };
  5. ReactDOM.render(
  6. <Menu
  7. onClick={onClick}
  8. className="customize-limit"
  9. header={<h3>分组菜单</h3>}
  10. footer={<h3>菜单尾部</h3>}
  11. >
  12. <Menu.Item key="1" helper="CTRL+P">
  13. Option 1
  14. </Menu.Item>
  15. <Menu.Item key="2">Option 2</Menu.Item>
  16. <Menu.Item key="3">Option 3</Menu.Item>
  17. <Menu.Item key="4">Option 4</Menu.Item>
  18. </Menu>,
  19. mountNode
  20. );
  1. .customize-limit {
  2. width: 200px;
  3. }
  4. .customize-limit h3 {
  5. padding-left:10px;
  6. font-size:14px;
  7. color:#666;
  8. margin:0;
  9. }

Checkbox模式

多选菜单 Checkbox 模式

Menu 菜单 - 图4

查看源码在线预览

  1. import { Menu } from "@icedesign/base";
  2. const onSelect = (...args) => {
  3. console.log(...args);
  4. };
  5. ReactDOM.render(
  6. <div>
  7. <Menu onSelect={onSelect} className="customize-limit">
  8. <Menu.CheckboxItem key="1">Option 1</Menu.CheckboxItem>
  9. <Menu.CheckboxItem disabled key="2">
  10. Option 2
  11. </Menu.CheckboxItem>
  12. <Menu.Divider key="5" />
  13. <Menu.CheckboxItem key="3">Option 3</Menu.CheckboxItem>
  14. <Menu.CheckboxItem key="4">Option 4</Menu.CheckboxItem>
  15. </Menu>
  16. </div>,
  17. mountNode
  18. );
  1. .customize-limit {
  2. width: 200px;
  3. }

普通多选

多选菜单

Menu 菜单 - 图5

查看源码在线预览

  1. import { Menu } from "@icedesign/base";
  2. const onSelect = (...args) => {
  3. console.log(...args);
  4. };
  5. ReactDOM.render(
  6. <Menu onSelect={onSelect} selectMode="multiple" className="customize-limit">
  7. <Menu.Item key="1">Option 1</Menu.Item>
  8. <Menu.Item disabled key="2">
  9. Option 2
  10. </Menu.Item>
  11. <Menu.Divider key="5" />
  12. <Menu.Item key="3">Option 3</Menu.Item>
  13. <Menu.Item key="4">Option 4</Menu.Item>
  14. </Menu>,
  15. mountNode
  16. );
  1. .customize-limit {
  2. width: 200px;
  3. }

外部弹出菜单

使用 PopupItem 弹出子菜单,与 SubMenumode=popup 的区别是子菜单会渲染到追加到 body 尾部的外部节点中

Menu 菜单 - 图6

查看源码在线预览

  1. import { Menu } from "@icedesign/base";
  2. const onClick = (...args) => {
  3. console.log(...args);
  4. };
  5. ReactDOM.render(
  6. <Menu onClick={onClick} className="customize-limit">
  7. <Menu.PopupItem label="Popup Item 1" key="xxx">
  8. <Menu>
  9. <Menu.Item key="1">Option 1</Menu.Item>
  10. <Menu.Item key="2">Option 2</Menu.Item>
  11. </Menu>
  12. </Menu.PopupItem>
  13. <Menu.PopupItem label="Popup Item 2" key="yyy">
  14. <Menu>
  15. <Menu.Item key="3">Option 3</Menu.Item>
  16. </Menu>
  17. </Menu.PopupItem>
  18. </Menu>,
  19. mountNode
  20. );
  1. .customize-limit {
  2. width: 200px;
  3. }

Radio模式

单选菜单 Radio 模式

Menu 菜单 - 图7

查看源码在线预览

  1. import { Menu } from "@icedesign/base";
  2. const onSelect = (...args) => {
  3. console.log(...args);
  4. };
  5. ReactDOM.render(
  6. <Menu onSelect={onSelect} className="customize-limit">
  7. <Menu.RadioItem key="1">Option 1</Menu.RadioItem>
  8. <Menu.RadioItem disabled key="2">
  9. Option 2
  10. </Menu.RadioItem>
  11. <Menu.Divider key="5" />
  12. <Menu.RadioItem key="3">Option 3</Menu.RadioItem>
  13. <Menu.RadioItem key="4">Option 4</Menu.RadioItem>
  14. </Menu>,
  15. mountNode
  16. );
  1. .customize-limit {
  2. width: 200px;
  3. }

单选

单选菜单

Menu 菜单 - 图8

查看源码在线预览

  1. import { Menu } from "@icedesign/base";
  2. const onSelect = (...args) => {
  3. console.log(...args);
  4. };
  5. ReactDOM.render(
  6. <Menu onSelect={onSelect} selectMode="single" className="customize-limit">
  7. <Menu.Item key="1">Option 1</Menu.Item>
  8. <Menu.Item disabled key="2">
  9. Option 2
  10. </Menu.Item>
  11. <Menu.Divider key="5" />
  12. <Menu.Item key="3">Option 3</Menu.Item>
  13. <Menu.Item key="4">Option 4</Menu.Item>
  14. </Menu>,
  15. mountNode
  16. );
  1. .customize-limit {
  2. width: 200px;
  3. }

内联菜单

SubMenu 的内联模式

Menu 菜单 - 图9

查看源码在线预览

  1. import { Menu } from "@icedesign/base";
  2. const onClick = (...args) => {
  3. console.log(...args);
  4. };
  5. ReactDOM.render(
  6. <Menu onClick={onClick} openMode="single" className="customize-limit">
  7. <Menu.SubMenu label="Sub Menu 1" key="xxx">
  8. <Menu.Item key="1">Option 1</Menu.Item>
  9. <Menu.Item key="2">Option 2</Menu.Item>
  10. </Menu.SubMenu>
  11. <Menu.SubMenu label="Sub Menu 2" key="yyy">
  12. <Menu.Item key="3">Option 3</Menu.Item>
  13. </Menu.SubMenu>
  14. </Menu>,
  15. mountNode
  16. );
  1. .customize-limit {
  2. width: 200px;
  3. }

弹出菜单

SubMenu 的弹出模式,与 PopupItem 的区别是子菜单会被渲染在内容区域里

Menu 菜单 - 图10

查看源码在线预览

  1. import { Menu } from "@icedesign/base";
  2. const onClick = (...args) => {
  3. console.log(...args);
  4. };
  5. ReactDOM.render(
  6. <Menu onClick={onClick} openMode="single" className="customize-limit">
  7. <Menu.SubMenu mode="popup" label="Sub Menu 1" key="xxx">
  8. <Menu.Item key="1">Option 1</Menu.Item>
  9. <Menu.Item key="2">Option 2</Menu.Item>
  10. </Menu.SubMenu>
  11. <Menu.SubMenu mode="popup" label="Sub Menu 2" key="yyy">
  12. <Menu.Item key="3">Option 3</Menu.Item>
  13. </Menu.SubMenu>
  14. </Menu>,
  15. mountNode
  16. );
  1. .customize-limit {
  2. width: 200px;
  3. }

子菜单标签可选

Menu 菜单 - 图11

查看源码在线预览

  1. import { Radio, Menu } from "@icedesign/base";
  2. const onSelect = (...args) => {
  3. console.log(...args);
  4. };
  5. class App extends React.Component {
  6. state = {
  7. subMenuSelectable: false
  8. };
  9. toggleSubMenuSelectable = value => {
  10. this.setState({
  11. subMenuSelectable: value === "true"
  12. });
  13. };
  14. render() {
  15. const { subMenuSelectable } = this.state;
  16. return (
  17. <div>
  18. <div className="button-wraper">
  19. <Radio.Group
  20. shape="button"
  21. size="large"
  22. value={subMenuSelectable ? "true" : "false"}
  23. onChange={this.toggleSubMenuSelectable}
  24. >
  25. <Radio value="false">子菜单标签不可选</Radio>
  26. <Radio value="true">子菜单标签可选</Radio>
  27. </Radio.Group>
  28. </div>
  29. <Menu
  30. selectMode="single"
  31. onSelect={onSelect}
  32. defaultOpenKeys={["4", "5"]}
  33. openMode="multiple"
  34. className="customize-limit"
  35. >
  36. <Menu.Item key="1">Option 1</Menu.Item>
  37. <Menu.Item key="2">Option 2</Menu.Item>
  38. <Menu.Item key="3">Option 3</Menu.Item>
  39. <Menu.SubMenu
  40. key="4"
  41. label="Sub Menu 1"
  42. selectable={this.state.subMenuSelectable}
  43. >
  44. <Menu.Item key="4-1">Option 1</Menu.Item>
  45. <Menu.Item key="4-2">Option 2</Menu.Item>
  46. </Menu.SubMenu>
  47. <Menu.SubMenu
  48. key="5"
  49. label="Sub Menu 2"
  50. selectable={this.state.subMenuSelectable}
  51. >
  52. <Menu.Item key="5-1">Option 1</Menu.Item>
  53. <Menu.Item key="5-2">Option 2</Menu.Item>
  54. </Menu.SubMenu>
  55. </Menu>
  56. </div>
  57. );
  58. }
  59. }
  60. ReactDOM.render(<App />, mountNode);
  1. .button-wraper {
  2. margin: 0 0 20px 0;
  3. }
  4. .customize-limit{
  5. width:200px;
  6. }

相关区块

Menu 菜单 - 图12

暂无相关区块