Nav 导航

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

安装方法

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

开发指南

何时使用

分为顶部导航和侧边导航,顶部导航提供全局性的类目和功能,侧边导航提供多级结构来收纳和排列网站架构。

注意事项

  • iconOnly 只适用垂直方向。

API。

API

Nav

继承自 Menu 的能力请查看 Menu 文档

参数说明类型默认值
children导航项和子导航ReactNode-
type导航类型可选值:'normal'(普通)'primary'(主要)'secondary'(次要)'line'(线形)Enum'normal'
direction导航布局可选值:'hoz'(水平)'ver'(垂直)Enum'ver'
hozAlign横向导航条 items 和 footer 的对齐方向,在 direction 设置为 'hoz' 并且 header 存在时生效可选值:'left', 'right'Enum'left'
activeDirection设置组件选中状态的 active 边方向可选值:null(无)'top'(上)'bottom'(下)'left'(左)'right'(右)Enum当 direction 为 'hoz' 时,默认值为 'bottom',当 direction 为 'ver' 时,默认值为 'left'
mode子导航打开的模式(水平导航只支持弹出)可选值:'inline', 'popup'Enum'inline'
triggerType子导航打开的触发方式可选值:'click', 'hover'Enum'click'
inlineIndent内联子导航缩进距离Number20
defaultOpenAll初始展开所有的子导航,只在 mode 设置为 'inline' 以及 openMode 设置为 'multiple' 下生效Booleanfalse
openMode内联子导航的展开模式,同时可以展开一个同级子导航还是多个同级子导航,该属性仅在 mode 为 inline 时生效可选值:'single', 'multiple'Enum'multiple'
selectedKeys当前选中导航项的 key 值String/Array-
defaultSelectedKeys初始选中导航项的 key 值String/Array[]
onSelect选中或取消选中导航项触发的回调函数签名:Function(selectedKeys: Array, item: Object, extra: Object) => void参数:selectedKeys: {Array} 选中的所有导航项的 keyitem: {Object} 选中或取消选中的导航项extra: {Object} 额外参数extra.select: {Boolean} 是否是选中extra.key: {Array} 导航项的 keyextra.label: {Object} 导航项的文本extra.keyPath: {Array} 导航项 key 的路径Function-
popupAlign弹出子导航的对齐方式(水平导航只支持 follow )可选值:'follow', 'outside'Enum'follow'
popupClassName弹出子导航的自定义类名String-
iconOnly是否只显示图标Boolean-
hasArrow是否显示右侧的箭头(仅在 iconOnly=true 时生效)Booleantrue
hasTooltip是否有 ToolTips (仅在 iconOnly=true 时生效)Booleanfalse
header自定义导航头部ReactNode-
footer自定义导航尾部ReactNode-
embeddable是否开启嵌入式模式,一般用于Layout的布局中,开启后没有默认背景、外层border、box-shadow,可以配合<Nav style={{lineHeight: '100px'}}> 自定义高度Booleanfalse

Nav.Group

继承自 Menu.Group 的能力请查看 Menu.Group 文档

参数说明类型默认值
label标签内容ReactNode-
children导航项和子导航ReactNode-

Nav.Item

继承自 Menu.Item 的能力请查看 Menu.Item 文档

参数说明类型默认值
icon自定义图标,可以使用 Icon 的 type,也可以使用组件 <Icon type="icon type" />String/ReactNode-
children导航内容ReactNode-

Nav.PopupItem

继承自 Menu.PopupItem 的能力请查看 Menu.PopupItem 文档

参数说明类型默认值
icon自定义图标,可以使用 Icon 的 type, 也可以使用组件 <Icon type="icon type" />String/ReactNode-
label标签内容ReactNode-
children弹出内容ReactNode-

Nav.SubNav

继承自 Menu.SubMenu 的能力请查看 Menu.SubMenu 文档

参数说明类型默认值
icon自定义图标,可以使用 Icon 的 type,也可以使用组件 <Icon type="your type" />String/ReactNode-
label标签内容ReactNode-
selectable是否可选Booleanfalse
children导航项和子导航ReactNode-

ARIA and KeyBoard

按键说明
Up Arrow导航到上一项
Down Arrow导航到下一项
Right Arrow打开子菜单,导航到子菜单第一项;横向菜单条第一层,导航到右一项
Left Arrow关闭子菜单,导航到父级菜单;横向菜单条第一层,导航到左一项
Enter打开子菜单,导航到子菜单第一项
Esc关闭子菜单,导航到父级菜单

代码示例

基本

最简单的使用方式。

Nav 导航 - 图1

查看源码在线预览

  1. import { Nav } from '@alifd/next';
  2. const { Item, SubNav } = Nav;
  3. const header = <span className="fusion">FUSION</span>;
  4. const footer = <a className="login-in" href="javascript:;">Login in</a>;
  5. ReactDOM.render(
  6. <Nav className="basic-nav" direction="hoz" type="primary" header={header} footer={footer} defaultSelectedKeys={['home']} triggerType="hover">
  7. <Item key="home">Home</Item>
  8. <SubNav label="Component" selectable>
  9. <Item key="next">Next</Item>
  10. <Item key="mext">Mext</Item>
  11. </SubNav>
  12. <Item key="document">Document</Item>
  13. </Nav>
  14. , mountNode);
  1. .basic-nav .fusion {
  2. margin: 8px 20px;
  3. width: 100px;
  4. color: #FFFFFF;
  5. font-size: 20px;
  6. }
  7. .basic-nav .login-in {
  8. margin: 0 20px;
  9. color: #FFFFFF;
  10. }
  11. .basic-nav .next-nav-item {
  12. width: 120px;
  13. }

定制

Nav 提供了丰富的配置,可以进行个性化定制。

Nav 导航 - 图2

查看源码在线预览

  1. import { Nav, Radio } from '@alifd/next';
  2. const { Item, SubNav } = Nav;
  3. class App extends React.Component {
  4. state = {
  5. type: 'normal',
  6. direction: 'hoz',
  7. activeDirection: null,
  8. triggerType: 'click'
  9. }
  10. setValue(name, value) {
  11. this.setState({
  12. [name]: value === '' ? null : value
  13. });
  14. }
  15. setTriggerType(triggerType) {
  16. this.setState({
  17. triggerType
  18. });
  19. }
  20. render() {
  21. const { type, direction, activeDirection, triggerType } = this.state;
  22. return (
  23. <div>
  24. <div className="demo-ctl">
  25. <Radio.Group shape="button" size="medium" value={type} onChange={this.setValue.bind(this, 'type')}>
  26. <Radio value="normal">type="normal"</Radio>
  27. <Radio value="primary">type="primary"</Radio>
  28. <Radio value="secondary">type="secondary"</Radio>
  29. <Radio value="line">type="line"</Radio>
  30. </Radio.Group>
  31. <Radio.Group shape="button" size="medium" value={direction} onChange={this.setValue.bind(this, 'direction')}>
  32. <Radio value="hoz">direction="hoz"</Radio>
  33. <Radio value="ver">direction="ver"</Radio>
  34. </Radio.Group>
  35. <Radio.Group shape="button" size="medium" value={activeDirection === null ? '' : activeDirection} onChange={this.setValue.bind(this, 'activeDirection')}>
  36. <Radio value="">activeDirection=null</Radio>
  37. {direction === 'hoz' ? <Radio value="top">activeDirection="top"</Radio> : null}
  38. {direction === 'hoz' ? <Radio value="bottom">activeDirection="bottom"</Radio> : null}
  39. {direction === 'ver' ? <Radio value="left">activeDirection="left"</Radio> : null}
  40. {direction === 'ver' ? <Radio value="right">activeDirection="right"</Radio> : null}
  41. </Radio.Group>
  42. <Radio.Group shape="button" size="medium" value={triggerType} onChange={this.setTriggerType.bind(this)}>
  43. <Radio value="click">triggerType="click"</Radio>
  44. <Radio value="hover">triggerType="hover"</Radio>
  45. </Radio.Group>
  46. </div>
  47. <Nav className="custom-nav" type={type} direction={direction} activeDirection={activeDirection} triggerType={triggerType}>
  48. <Item>Item 1</Item>
  49. <Item>Item 2</Item>
  50. <SubNav label="Sub Nav">
  51. <Item>Item 3</Item>
  52. <Item>Item 4</Item>
  53. <SubNav label="Sub Nav">
  54. <Item>Item 5</Item>
  55. <Item>Item 6</Item>
  56. </SubNav>
  57. </SubNav>
  58. <Item icon="account">
  59. <a href="http://www.taobao.com" target="_blank">Taobao</a>
  60. </Item>
  61. </Nav>
  62. </div>
  63. );
  64. }
  65. }
  66. ReactDOM.render(<App />, mountNode);
  1. .demo-ctl {
  2. background-color: #F1F1F1;
  3. border-left: 4px solid #0D599A;
  4. color: #0A7AC3;
  5. margin-bottom: 20px;
  6. padding: 5px;
  7. }
  8. .demo-ctl .next-radio-group {
  9. display: block;
  10. margin: 5px;
  11. }
  12. .custom-nav.next-hoz .next-nav-item {
  13. width: 100px;
  14. }
  15. .custom-nav.next-ver {
  16. width: 200px;
  17. }

只显示图标

Nav 可设置 iconOnly 属性,只显示图标,以减少占用空间。

Nav 导航 - 图3

查看源码在线预览

  1. import { Nav, Radio } from '@alifd/next';
  2. const { Item, SubNav } = Nav;
  3. class App extends React.Component {
  4. state = {
  5. iconOnly: false,
  6. hasTooltip: true,
  7. hasArrow: true
  8. }
  9. setValue(name, value) {
  10. this.setState({
  11. [name]: value === 'true'
  12. });
  13. }
  14. render() {
  15. const { iconOnly, hasTooltip, hasArrow } = this.state;
  16. return (
  17. <div>
  18. <div className="demo-ctl">
  19. <Radio.Group shape="button" size="medium" value={iconOnly ? 'true' : 'false'} onChange={this.setValue.bind(this, 'iconOnly')}>
  20. <Radio value="true">iconOnly=true</Radio>
  21. <Radio value="false">iconOnly=false</Radio>
  22. </Radio.Group>
  23. {iconOnly ?
  24. <Radio.Group shape="button" size="medium" value={hasArrow ? 'true' : 'false'} onChange={this.setValue.bind(this, 'hasArrow')}>
  25. <Radio value="true">hasArrow=true</Radio>
  26. <Radio value="false">hasArrow=false</Radio>
  27. </Radio.Group> : null}
  28. {iconOnly ?
  29. <Radio.Group shape="button" size="medium" value={hasTooltip ? 'true' : 'false'} onChange={this.setValue.bind(this, 'hasTooltip')}>
  30. <Radio value="true">hasTooltip=true</Radio>
  31. <Radio value="false">hasTooltip=false</Radio>
  32. </Radio.Group> : null}
  33. </div>
  34. <Nav style={{ width: '200px' }} iconOnly={iconOnly} hasArrow={hasArrow} hasTooltip={hasTooltip}>
  35. <Item icon="account">Navigation One</Item>
  36. <Item icon="account">Navigation Two</Item>
  37. <Item icon="account">Navigation Three</Item>
  38. <Item icon="account">Navigation Four</Item>
  39. <Item icon="account">Navigation Five</Item>
  40. <SubNav icon="account" label="Sub Nav">
  41. <Item icon="account">Item 1</Item>
  42. <Item icon="account">Item 2</Item>
  43. <Item icon="account">Item 3</Item>
  44. <Item icon="account">Item 4</Item>
  45. </SubNav>
  46. </Nav>
  47. </div>
  48. );
  49. }
  50. }
  51. ReactDOM.render(<App />, mountNode);
  1. .demo-ctl {
  2. background-color: #F1F1F1;
  3. border-left: 4px solid #0D599A;
  4. color: #0A7AC3;
  5. margin-bottom: 20px;
  6. padding: 5px;
  7. }
  8. .demo-ctl .next-radio-group {
  9. margin: 5px;
  10. }

分组

建议只在垂直布局中使用。

Nav 导航 - 图4

查看源码在线预览

  1. import { Nav } from '@alifd/next';
  2. const { Item, Group } = Nav;
  3. ReactDOM.render(
  4. <Nav style={{ width: 240 }}>
  5. <Group label="Group Label 1">
  6. <Item icon="account">Navigation One</Item>
  7. <Item icon="account">Navigation Two</Item>
  8. <Item icon="account">Navigation Three</Item>
  9. </Group>
  10. <Group label="Group Label 2">
  11. <Item icon="account">Navigation Four</Item>
  12. <Item icon="account">Navigation Five</Item>
  13. <Item icon="account">Navigation Six</Item>
  14. </Group>
  15. </Nav>, mountNode);

展开模式

当 Nav 的 mode="inline" 时,openMode 可控制同级内联子导航的展开数量。

Nav 导航 - 图5

查看源码在线预览

  1. import { Nav, Radio } from '@alifd/next';
  2. const { Item, SubNav } = Nav;
  3. class App extends React.Component {
  4. state = {
  5. openMode: 'single'
  6. }
  7. setValue(openMode) {
  8. this.setState({
  9. openMode
  10. });
  11. }
  12. render() {
  13. const { openMode } = this.state;
  14. return (
  15. <div>
  16. <div className="demo-ctl">
  17. <Radio.Group shape="button" size="medium" value={openMode} onChange={this.setValue.bind(this)}>
  18. <Radio value="single">openMode="single"</Radio>
  19. <Radio value="multiple">openMode="multiple"</Radio>
  20. </Radio.Group>
  21. </div>
  22. <Nav style={{ width: 240 }} openMode={openMode}>
  23. <SubNav label="Sub Nav 1">
  24. <Item>Item 1</Item>
  25. </SubNav>
  26. <SubNav label="Sub Nav 2">
  27. <Item>Item 1</Item>
  28. <Item>Item 2</Item>
  29. <SubNav label="Sub Nav 1">
  30. <Item>Item 1</Item>
  31. <Item>Item 2</Item>
  32. </SubNav>
  33. <SubNav label="Sub Nav 2">
  34. <Item>Item 1</Item>
  35. <Item>Item 2</Item>
  36. </SubNav>
  37. </SubNav>
  38. <SubNav label="Sub Nav 3">
  39. <Item>Item 1</Item>
  40. <Item>Item 2</Item>
  41. <Item>Item 3</Item>
  42. <SubNav label="Sub Nav 1">
  43. <Item>Item 1</Item>
  44. <Item>Item 2</Item>
  45. <Item>Item 3</Item>
  46. </SubNav>
  47. <SubNav label="Sub Nav 2">
  48. <Item>Item 1</Item>
  49. <Item>Item 2</Item>
  50. <Item>Item 3</Item>
  51. </SubNav>
  52. <SubNav label="Sub Nav 3">
  53. <Item>Item 1</Item>
  54. <Item>Item 2</Item>
  55. <Item>Item 3</Item>
  56. </SubNav>
  57. </SubNav>
  58. <Item>Item</Item>
  59. </Nav>
  60. </div>);
  61. }
  62. }
  63. ReactDOM.render(<App />, mountNode);
  1. .demo-ctl {
  2. background-color: #F1F1F1;
  3. border-left: 4px solid #0D599A;
  4. color: #0A7AC3;
  5. margin-bottom: 20px;
  6. padding: 5px;
  7. }
  8. .demo-ctl .next-radio-group {
  9. margin: 5px;
  10. }

对齐方式

当 Nav 的 mode="popup" 时,popAlign 可控制弹出子导航的对齐方式。

Nav 导航 - 图6

查看源码在线预览

  1. import { Nav, Radio } from '@alifd/next';
  2. const { Item, SubNav } = Nav;
  3. class App extends React.Component {
  4. state = {
  5. popupAlign: 'follow'
  6. }
  7. setValue(popupAlign) {
  8. this.setState({
  9. popupAlign
  10. });
  11. }
  12. render() {
  13. const { popupAlign } = this.state;
  14. return (
  15. <div>
  16. <div className="demo-ctl">
  17. <Radio.Group shape="button" size="medium" value={popupAlign} onChange={this.setValue.bind(this)}>
  18. <Radio value="follow">popupAlign="follow"</Radio>
  19. <Radio value="outside">popupAlign="outside"</Radio>
  20. </Radio.Group>
  21. </div>
  22. <Nav style={{ height: 400, width: 240 }} mode="popup" popupAlign={popupAlign} defaultOpenKeys={['sub-nav-2']}>
  23. <SubNav key="sub-nav-1"label="Sub Nav 1">
  24. <Item key="1">Item 1</Item>
  25. </SubNav>
  26. <SubNav key="sub-nav-2" label="Sub Nav 2">
  27. <Item key="1">Item 1</Item>
  28. <Item key="2">Item 2</Item>
  29. </SubNav>
  30. <SubNav key="sub-nav-3" label="Sub Nav 3">
  31. <Item key="1">Item 1</Item>
  32. <Item key="2">Item 2</Item>
  33. <Item key="3">Item 3</Item>
  34. </SubNav>
  35. <SubNav key="sub-nav-4" label="Sub Nav 4">
  36. <Item key="1">Item 1</Item>
  37. <Item key="2">Item 2</Item>
  38. <Item key="3">Item 3</Item>
  39. <Item key="4">Item 4</Item>
  40. </SubNav>
  41. </Nav>
  42. </div>
  43. );
  44. }
  45. }
  46. ReactDOM.render(<App />, mountNode);
  1. .demo-ctl {
  2. background-color: #F1F1F1;
  3. border-left: 4px solid #0D599A;
  4. color: #0A7AC3;
  5. margin-bottom: 20px;
  6. padding: 5px;
  7. }
  8. .demo-ctl .next-radio-group {
  9. margin: 5px;
  10. }

相关区块

Nav 导航 - 图7

暂无相关区块