Tab 选项卡

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

安装方法

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

Guide

TAB 让用户可以在不同子任务、视图、模式之间切换,它具有全局导航的作用,是全局功能的主要展示和切换区域,一个TAB标记一个核心功能,TAB之间可以快速点击切换。该窗口包含2个以上的选项卡,所有选项卡可以排列在一行中,即使该用户界面被本地化后也是如此。提供平级的区域将大块内容进行收纳和展现,保持界面整洁。

何时使用

Fusion 提供了三级选项卡,分别用于不同的场景。

  • 普通选项卡,引领整页面的内容,起导航的作用。

  • 文本型选项卡。

  • 包裹型选项卡,在页面结构中,只是局部展示,需要和其他内容结合出现。

  • 胶囊型选项卡。

关于动效

如果您不想开启动效,可以通过设置 animation 属性值为 false 来关闭。

API

Tab

参数说明类型默认值
activeKey被激活的选项卡的 key, 赋值则tab为受控组件, 用户无法切换Number/String-
size尺寸可选值:'small', 'medium'Enum'medium'
shape外观形态可选值:'pure', 'wrapped', 'text', 'capsule'Enum'pure'
defaultActiveKey初始化时被激活的选项卡的 keyNumber/String-
animation是否开启动效Booleantrue
excessMode选项卡过多时的滑动模式可选值:'slide', 'dropdown'Enum'slide'
tabPosition导航选项卡的位置,只适用于包裹型(wrapped)选项卡可选值:'top', 'bottom', 'left', 'right'Enum'top'
triggerType激活选项卡的触发方式可选值:'hover', 'click'Enum'click'
lazyLoad是否延迟加载 TabPane 的内容, 默认开启, 即不提前渲染Booleantrue
unmountInactiveTabs是否自动卸载未处于激活状态的选项卡Booleanfalse
navStyle导航条的自定义样式Object-
navClassName导航条的自定义样式类String-
contentStyle内容区容器的自定义样式Object-
contentClassName内容区容器的自定义样式类String-
extra导航栏附加内容ReactNode-
onClick点击单个选项卡时触发的回调签名:Function() => voidFunction() => {}
onChange选项卡发生切换时的事件回调签名:Function(key: String/Number) => void参数:key: {String/Number} 改变后的 keyFunction() => {}
onClose选项卡被关闭时的事件回调签名:Function(key: String/Number) => void参数:key: {String/Number} 关闭的选项卡的 keyFunction() => {}
tabRender自定义选项卡模板渲染函数签名:Function(key: String, props: Object) => ReactNode参数:key: {String} 当前 Tab.Item 的 key 值props: {Object} 传给 Tab.Item 的所有属性键值对返回值:{ReactNode} 返回自定义组件Function-
popupProps弹层属性透传, 只有当 excessMode 为 dropdown 时生效Object-

Tab.Item

参数说明类型默认值
title选项卡标题ReactNode-
closeable单个选项卡是否可关闭Booleanfalse
disabled选项卡是否被禁用Boolean-

ARIA and KeyBoard

按键说明
Right Arrow切换至前一项Tab.Item
Left Arrow切换至后一项Tab.Item

代码示例

简单用法

使用 Tab 最简单的例子。

Tab 选项卡 - 图1

查看源码在线预览

  1. import { Tab } from '@alifd/next';
  2. ReactDOM.render(
  3. <Tab>
  4. <Tab.Item title="Home" key="1">Home content</Tab.Item>
  5. <Tab.Item title="Documentation" key="2">Doc content</Tab.Item>
  6. <Tab.Item title="Help" key="3">Help Content</Tab.Item>
  7. </Tab>
  8. , mountNode);
  1. .next-tabs-content {
  2. color: #333;
  3. font-size: 12px;
  4. padding: 12px;
  5. }

形态

根据使用场景及触发控件的类型,可以通过 shape 属性配置选项卡的类型,主要包括:

  • pure 普通选项卡(默认)
  • wrapped 包裹型选项卡
  • text 文本型选项卡
  • capsule 胶囊型选项卡

Tab 选项卡 - 图2

查看源码在线预览

  1. import { Tab } from '@alifd/next';
  2. function onChange(key) {
  3. console.log(key);
  4. }
  5. const tabs = [
  6. { tab: 'Home', key: 'home', content: 'This is home page' },
  7. { tab: 'Document', key: 'doc', content: 'This is document page' },
  8. { tab: 'API', key: 'api', content: 'This is api page' },
  9. { tab: 'Repo', key: 'repo', content: 'This ia repo link' }
  10. ];
  11. const shapes = ['pure', 'wrapped', 'text', 'capsule'];
  12. ReactDOM.render(
  13. <div className="fusion-demo">
  14. {
  15. shapes.map(shape => (<div key={shape} className="fusion-demo-item">
  16. <Tab shape={shape} onChange={onChange}>
  17. {
  18. tabs.map(tab => <Tab.Item title={tab.tab} key={tab.key}>{tab.content}</Tab.Item>)
  19. }
  20. </Tab>
  21. </div>))
  22. }
  23. </div>
  24. , mountNode);
  1. .fusion-demo-item {
  2. margin: 14px 0;
  3. }
  4. .next-tabs-content {
  5. color: #333;
  6. font-size: 12px;
  7. padding: 12px;
  8. }

尺寸

组件尺寸,可以通过size属性设置,提供medium(默认)和small两种尺寸,small尺寸的选项卡组件可以用在弹出框等较狭窄的容器内。

Tab 选项卡 - 图3

查看源码在线预览

  1. import { Tab } from '@alifd/next';
  2. const tabs = [
  3. { tab: 'Home', key: 'home', content: 'This is home page' },
  4. { tab: 'Document', key: 'doc', content: 'This is document page' },
  5. { tab: 'API', key: 'api', content: 'This is api page' }
  6. ];
  7. ReactDOM.render(
  8. <div>
  9. <Tab size="small">
  10. {tabs.map(item => <Tab.Item key={item.key} title={item.tab}>{item.content}</Tab.Item>)}
  11. </Tab>
  12. <br />
  13. <Tab size="small" shape="wrapped">
  14. {tabs.map(item => <Tab.Item key={item.key} title={item.tab}>{item.content}</Tab.Item>)}
  15. </Tab>
  16. <br />
  17. <Tab size="small" shape="text">
  18. {tabs.map(item => <Tab.Item key={item.key} title={item.tab}>{item.content}</Tab.Item>)}
  19. </Tab>
  20. <br />
  21. <Tab size="small" shape="capsule">
  22. {tabs.map(item => <Tab.Item key={item.key} title={item.tab}>{item.content}</Tab.Item>)}
  23. </Tab>
  24. </div>, mountNode);
  1. .next-tabs-content {
  2. color: #333;
  3. font-size: 12px;
  4. padding: 12px;
  5. }

按需加载和自动卸载

默认情况 Tab 不会提前渲染好所有的内容,而是根据 Tab 的激活情况依次进行渲染。某些时候,如果你想一次渲染好所有内容,可以设置 lazyLoad={false} 进行关闭。此外,某些时候,如果你想每次切换选项卡时自动卸载未激活的 Tab,可以设置 unmountInactiveTabs 开启。

Tab 选项卡 - 图4

查看源码在线预览

  1. import { Tab } from '@alifd/next';
  2. const tabs = [
  3. { tab: 'Home', key: 0, content: 'This is home page' },
  4. { tab: 'Document', key: 1, content: 'This is document page' },
  5. { tab: 'API', key: 2, content: 'This is api page' }
  6. ];
  7. ReactDOM.render(
  8. <div>
  9. <div>Render all tab contents</div>
  10. <Tab lazyLoad={false}>
  11. {
  12. tabs.map(item => <Tab.Item key={item.key} title={item.tab}>{item.content}</Tab.Item>)
  13. }
  14. </Tab>
  15. <div>Unmount inactive tabs</div>
  16. <Tab unmountInactiveTabs>
  17. {
  18. tabs.map(item => <Tab.Item key={item.key} title={item.tab}>{item.content}</Tab.Item>)
  19. }
  20. </Tab>
  21. </div>
  22. , mountNode);
  1. .next-tabs-content {
  2. color: #333;
  3. font-size: 12px;
  4. padding: 12px;
  5. }

位置

包裹型选项卡支持通过 tabPosition 属性设置选项卡的位置,支持 top | right | bottom | left 四个方向。

Tab 选项卡 - 图5

查看源码在线预览

  1. import { Tab, Select } from '@alifd/next';
  2. class Demo extends React.Component {
  3. state = {
  4. position: 'top'
  5. }
  6. changePosition = (val) => {
  7. this.setState({
  8. position: val
  9. });
  10. }
  11. render() {
  12. return (<div>
  13. <Select onChange={this.changePosition} placeholder="Choose Positon of Tab">
  14. {
  15. ['top', 'bottom', 'left', 'right'].map(item => <Select.Option value={item} key={item}>{item}</Select.Option>)
  16. }
  17. </Select><br /><br />
  18. <Tab tabPosition={this.state.position} shape="wrapped" contentClassName="custom-tab-content">
  19. <Tab.Item title="Tab 1" key="1">Tab 1 Content</Tab.Item>
  20. <Tab.Item title="Tab 2" key="2">Tab 2 Content</Tab.Item>
  21. <Tab.Item title="Tab 3" key="3">Tab 3 Content</Tab.Item>
  22. </Tab>
  23. </div>);
  24. }
  25. }
  26. ReactDOM.render(<Demo />, mountNode);
  1. .custom-tab-content {
  2. min-height: 50px;
  3. }
  4. .next-tabs-content {
  5. color: #333;
  6. font-size: 12px;
  7. padding: 12px;
  8. }

超出时滑动

当 Tab 标签非常多时,组件会自动增加滑动支持。可以用过 excessMode 属性切换滑动模式,该属性仅在tabPositiontop或者bottom时生效。

Tab 选项卡 - 图6

查看源码在线预览

  1. import { Tab } from '@alifd/next';
  2. const tabs = [
  3. { tab: 'Home', key: 1 },
  4. { tab: 'Documnet', key: 2 },
  5. { tab: 'Setting', key: 3 },
  6. { tab: 'Help', key: 4 },
  7. { tab: 'Admin', key: 5 },
  8. { tab: 'More 1', key: 6 },
  9. { tab: 'More 2', key: 7 },
  10. { tab: 'More 3', key: 8 },
  11. { tab: 'More 4', key: 9 },
  12. { tab: 'More 5', key: 10 },
  13. { tab: 'More 6', key: 11 },
  14. { tab: 'More 7', key: 12 },
  15. { tab: 'More 8', key: 13 },
  16. { tab: 'More 9', key: 14 },
  17. { tab: 'More 10', key: 15 },
  18. { tab: 'More 11', key: 16 }
  19. ];
  20. function onClick(key) {
  21. console.log(key);
  22. }
  23. ReactDOM.render(<div className="fusion-demo" style={{ maxWidth: '520px' }}>
  24. <div className="demo-item-title">Dropdown mode</div>
  25. <Tab excessMode="dropdown">
  26. {
  27. tabs.map(item => <Tab.Item key={item.key} title={item.tab} onClick={onClick}>{item.tab} content, content, content</Tab.Item>)
  28. }
  29. </Tab>
  30. <div className="demo-item-title">Slide mode</div>
  31. <Tab excessMode="slide">
  32. {
  33. tabs.map(item => <Tab.Item key={item.key} title={item.tab} onClick={onClick}>{item.tab} content, content, content</Tab.Item>)
  34. }
  35. </Tab>
  36. </div>
  37. , mountNode);
  1. .fusion-demo .demo-item-title {
  2. font-size: 16px;
  3. color: #333;
  4. padding: 8px;
  5. margin: 14px 0;
  6. }
  7. .next-tabs-content {
  8. color: #333;
  9. font-size: 12px;
  10. padding: 12px;
  11. }

可关闭选项卡

可关闭选项卡,可以通过在 Tab.Item 上设置 closeable 属性设置该选项卡是否可关闭。

Tab 选项卡 - 图7

查看源码在线预览

  1. import { Tab, Button, Icon } from '@alifd/next';
  2. const panes = [
  3. { tab: 'Mail', key: 1, closeable: false },
  4. { tab: 'Message', key: 2, closeable: true },
  5. { tab: 'Setting', key: 3, closeable: true },
  6. { tab: 'Unread', key: 4, closeable: true }
  7. ];
  8. class CloseableTab extends React.Component {
  9. constructor(props) {
  10. super(props);
  11. this.state = {
  12. panes: panes,
  13. activeKey: panes[0].key
  14. };
  15. }
  16. /*eslint-disable eqeqeq */
  17. remove(targetKey) {
  18. let activeKey = this.state.activeKey;
  19. const panes = [];
  20. this.state.panes.forEach(pane => {
  21. if (pane.key != targetKey) {
  22. panes.push(pane);
  23. }
  24. });
  25. if (targetKey == activeKey) {
  26. activeKey = panes[0].key;
  27. }
  28. this.setState({ panes, activeKey });
  29. }
  30. onClose = (targetKey) => {
  31. this.remove(targetKey);
  32. }
  33. onChange = (activeKey) => {
  34. this.setState({ activeKey });
  35. }
  36. addTabpane = () => {
  37. this.setState(prevState => {
  38. const { panes } = prevState;
  39. panes.push({ tab: 'new tab', key: Math.random(), closeable: true });
  40. return { panes };
  41. });
  42. }
  43. render() {
  44. const state = this.state;
  45. return (
  46. <div>
  47. <Button onClick={this.addTabpane} size="large" type="primary"><Icon type="add"/> New Tab</Button>
  48. <Tab
  49. shape="wrapped"
  50. activeKey={state.activeKey}
  51. onChange={this.onChange}
  52. onClose={this.onClose}
  53. className="custom-tab">
  54. {state.panes.map(item => <Tab.Item title={item.tab} key={item.key} closeable={item.closeable}>{item.tab} content</Tab.Item>)}
  55. </Tab>
  56. </div>
  57. );
  58. }
  59. }
  60. ReactDOM.render(<CloseableTab />, mountNode);
  1. .custom-tab {
  2. margin-top: 14px;
  3. }
  4. .next-tabs-content {
  5. color: #333;
  6. font-size: 12px;
  7. padding: 12px;
  8. }

触发类型

Tab 支持 click 切换和 hover 切换两种触发类型,默认为 click 触发,您可以使用 triggerType 属性修改默认的触发类型。

Tab 选项卡 - 图8

查看源码在线预览

  1. import { Tab } from '@alifd/next';
  2. const tabs = [
  3. { tab: 'Home', key: 0, content: 'This is home page' },
  4. { tab: 'Document', key: 1, content: 'This is document page' },
  5. { tab: 'API', key: 2, content: 'This is api page' }
  6. ];
  7. function onChange(key) {
  8. console.log('change', key);
  9. }
  10. function handleClick(key) {
  11. console.log('click', key);
  12. }
  13. function onMouseEnter(key, e) {
  14. console.log('enter', e.target, key);
  15. }
  16. function onMouseLeave(key, e) {
  17. console.log('leave', e.target, key);
  18. }
  19. ReactDOM.render(
  20. <div className="fusion-demo">
  21. <div className="demo-item-title">Click to trigger change</div>
  22. <Tab triggerType="click" onChange={onChange}>
  23. {
  24. tabs.map(item => <Tab.Item key={item.key} title={item.tab} onClick={handleClick}>{item.content}</Tab.Item>)
  25. }
  26. </Tab>
  27. <div className="demo-item-title">Hover to trigger change</div>
  28. <Tab triggerType="hover" onChange={onChange}>
  29. {
  30. tabs.map(item => (<Tab.Item
  31. key={item.key}
  32. title={item.tab}
  33. onClick={handleClick}
  34. onMouseEnter={onMouseEnter}
  35. onMouseLeave={onMouseLeave}>
  36. {item.content}
  37. </Tab.Item>))
  38. }
  39. </Tab>
  40. </div>
  41. , mountNode);
  1. .fusion-demo .demo-item-title {
  2. font-size: 16px;
  3. color: #333;
  4. padding: 8px;
  5. margin: 14px 0;
  6. }
  7. .next-tabs-content {
  8. color: #333;
  9. font-size: 12px;
  10. padding: 12px;
  11. }

禁用

可以通过 disabled 属性禁用某一个选型卡。

Tab 选项卡 - 图9

查看源码在线预览

  1. import { Tab } from '@alifd/next';
  2. ReactDOM.render(
  3. <Tab>
  4. <Tab.Item title="Tab 1" disabled key="1">Tab 1 content</Tab.Item>
  5. <Tab.Item title="Tab 2" key="2">Tab 2 content</Tab.Item>
  6. <Tab.Item title="Tab 3" key="3">Tab 3 content</Tab.Item>
  7. </Tab>
  8. , mountNode);
  1. .next-tabs-content {
  2. color: #333;
  3. font-size: 12px;
  4. padding: 12px;
  5. }

自定义样式

在 Tab 已有样式的基础上,可以通过 contentStyle, contentClassName 等属性自由的进行样式自定义。

Tab 选项卡 - 图10

查看源码在线预览

  1. import { Tab } from '@alifd/next';
  2. const panes = [
  3. {
  4. tab: 'Todo Tasks',
  5. key: 0
  6. },
  7. {
  8. tab: 'Finished Tasks',
  9. key: 1
  10. },
  11. {
  12. tab: 'Unread Messages',
  13. key: 2
  14. },
  15. {
  16. tab: 'Past Messages',
  17. key: 3
  18. },
  19. {
  20. tab: 'All Messages',
  21. key: 4
  22. }
  23. ];
  24. const detachedContentStyle = {
  25. border: '1px solid #DCDEE3',
  26. padding: '20px'
  27. };
  28. ReactDOM.render(<div className="fusion-demo">
  29. <div className="demo-item-title">Customize with contentStyle or contentClassName</div>
  30. <Tab shape="wrapped" contentStyle={detachedContentStyle}>
  31. {
  32. panes.map(pane => <Tab.Item title={pane.tab} key={pane.key}>{pane.tab}</Tab.Item>)
  33. }
  34. </Tab>
  35. <div className="demo-item-title">Setting className and style in Tab.Item</div>
  36. <Tab shape="wrapped" navStyle={{ background: '#DEE8FF' }}>
  37. {
  38. panes.map(pane => {
  39. return (<Tab.Item
  40. title={pane.tab}
  41. key={pane.key}
  42. className="custom-tab-item"
  43. style={{background: '#FFF'}}>{pane.tab}</Tab.Item>
  44. );
  45. })
  46. }
  47. </Tab>
  48. <div className="demo-item-title">Tabs with equal width</div>
  49. <Tab shape="capsule">
  50. {
  51. panes.map(pane => <Tab.Item title={pane.tab} key={pane.key} className="justify-tabs-tab">{pane.tab}</Tab.Item>)
  52. }
  53. </Tab>
  54. </div>
  55. , mountNode);
  1. .fusion-demo .demo-item-title {
  2. font-size: 16px;
  3. color: #333;
  4. padding: 8px;
  5. margin: 14px 0;
  6. }
  7. .custom-content {
  8. padding: 15px;
  9. }
  10. .next-tabs-content {
  11. color: #333;
  12. font-size: 12px;
  13. padding: 12px;
  14. }
  15. .custom-tab-item {
  16. margin-right: -1px !important;
  17. }
  18. .justify-tabs-tab {
  19. width: 140px;
  20. text-align: center;
  21. }

自定义选项卡

Tab 支持使用 tabRender 属性返回自定义组件作为选项卡内容,注意该属性接收函数作为属性值。

Tab 选项卡 - 图11

查看源码在线预览

  1. import { Tab } from '@alifd/next';
  2. function CustomTabItem({ title, desc }) {
  3. return (<div className="custom-tab-item">
  4. <div className="tab-title">{title}</div>
  5. <div className="tab-desc">{desc}</div>
  6. </div>);
  7. }
  8. const panes = [
  9. { key: 'e-checking', title: 'Alipay', desc: 'The fee to be paid is $15' },
  10. { key: 'brand-card', title: 'Bank Card', desc: 'The fee to be paid is $17' }
  11. ];
  12. ReactDOM.render(
  13. <Tab shape="wrapped" tabRender={(key, props) => <CustomTabItem key={key} {...props} />}>
  14. {
  15. panes.map(pane => <Tab.Item key={pane.key} {...pane} tabStyle={{ height: '60px' }}>{pane.desc}</Tab.Item>)
  16. }
  17. </Tab>
  18. , mountNode);
  1. .custom-tab-item {
  2. padding: 10px;
  3. }
  4. .tab-title {
  5. font-size: 20px;
  6. }
  7. .tab-desc {
  8. margin: 10px 0 0 0;
  9. font-size: 12px;
  10. }
  11. .next-tabs-content {
  12. color: #333;
  13. font-size: 12px;
  14. padding: 12px;
  15. }

附加额外内容

通过 extra 属性添加附加内容,请确保只在有限选项卡的情况下才使用附加内容, 该功能在选项卡溢出时会和溢出导航的按钮冲突。

Tab 选项卡 - 图12

查看源码在线预览

  1. import { Tab, Button } from '@alifd/next';
  2. function handleChange(key) {
  3. console.log(key);
  4. }
  5. function handleClick() {
  6. console.log('hello world');
  7. }
  8. const extraContent = <Button type="primary" onClick={handleClick}>Hello world</Button>;
  9. ReactDOM.render(
  10. <div className="fusion-demo">
  11. <div className="demo-item-title">Extra in Horizontal</div>
  12. <Tab shape="wrapped" onChange={handleChange} extra={extraContent}>
  13. <Tab.Item title="Tab 1" key="1">Tab 1 Content</Tab.Item>
  14. <Tab.Item title="Tab 2" key="2">Tab 2 Content</Tab.Item>
  15. <Tab.Item title="Tab 3" key="3">Tab 3 Content</Tab.Item>
  16. </Tab>
  17. <div className="demo-item-title">Extra in Vertical</div>
  18. <Tab shape="wrapped" tabPosition="left" onChange={handleChange} extra={extraContent} contentClassName="custom-tab-content">
  19. <Tab.Item title="Tab 1" key="1">Tab 1 Content</Tab.Item>
  20. <Tab.Item title="Tab 2" key="2">Tab 2 Content</Tab.Item>
  21. <Tab.Item title="Tab 3" key="3">Tab 3 Content</Tab.Item>
  22. </Tab>
  23. </div>
  24. , mountNode);
  1. .fusion-demo .demo-item-title {
  2. font-size: 16px;
  3. color: #333;
  4. padding: 8px;
  5. margin: 14px 0;
  6. }
  7. .custom-tab-content {
  8. min-height: 150px;
  9. }
  10. .next-tabs-content {
  11. color: #333;
  12. font-size: 12px;
  13. padding: 12px;
  14. }

可编辑的 Tab

Tab 允许开发者在上层进行自由的行为控制,例如用户可以基于 Tab 开发一个标题部分双击可编辑的 Tab ,此时用户只要传入自定义组件给 TabPane 即可,Tab 可以将底层事件对象传递给用户的自定义组件。

Tab 选项卡 - 图13

查看源码在线预览

  1. import { Tab, Input } from '@alifd/next';
  2. class EditableTabPane extends React.Component {
  3. constructor(props) {
  4. super(props);
  5. this.state = {
  6. tabTitle: props.defaultTitle,
  7. editable: false
  8. };
  9. }
  10. componentWillReceiveProps(nextProps) {
  11. if (nextProps.defaultTitle !== this.state.tabTitle) {
  12. this.setState({
  13. tabTitle: nextProps.defaultTitle
  14. });
  15. }
  16. }
  17. onKeyDown = (e) => {
  18. const { keyCode } = e;
  19. // Stop bubble up the events of keyUp, keyDown, keyLeft, and keyRight
  20. if (keyCode > 36 && keyCode < 41) {
  21. e.stopPropagation();
  22. }
  23. }
  24. onBlur = (e) => {
  25. this.setState({
  26. editable: false,
  27. tabTitle: e.target.value
  28. });
  29. }
  30. onDblClick = () => {
  31. this.setState({
  32. editable: true
  33. });
  34. }
  35. render() {
  36. const { tabTitle, editable } = this.state;
  37. if (editable) {
  38. return <Input defaultValue={tabTitle} onKeyDown={this.onKeyDown} onBlur={this.onBlur} />;
  39. }
  40. return <span onDoubleClick={this.onDblClick}>{tabTitle}</span>;
  41. }
  42. }
  43. const tabRender = (key, { title }) => (<div key={key} className="editable-tab-wrapper">
  44. <EditableTabPane defaultTitle={title} />
  45. </div>);
  46. ReactDOM.render(<Tab defaultActiveKey="1" tabRender={tabRender}>
  47. <Tab.Item title="Double Click To Edit Me" key="1">Editable tab</Tab.Item>
  48. <Tab.Item title="Double Click To Edit Me" key="2">Editable tab</Tab.Item>
  49. </Tab>, mountNode);
  1. .editable-tab-wrapper {
  2. padding: 10px;
  3. }
  4. .next-tabs-content {
  5. color: #333;
  6. font-size: 12px;
  7. padding: 12px;
  8. }

在 Grid 中使用 Tab

当 Tab 位于 Grid 组件的布局中时,由于 Grid 默认使用 flex 布局方式,当选项卡数量过多时,会导致内层元素撑起整个 flex 容器,此时需要给容器添加自定义样式 overflow: hidden

Tab 选项卡 - 图14

查看源码在线预览

  1. import { Tab, Grid } from '@alifd/next';
  2. const { Row, Col } = Grid;
  3. const tabs = function(length) {
  4. const arr = [];
  5. for (let i = 1; i < length; i++) {
  6. arr.push({ tab: `tab ${i}`, key: i, content: `tab ${i} content` });
  7. }
  8. return arr;
  9. }(15);
  10. ReactDOM.render(
  11. <div className="custom-wrapper">
  12. <Row className="custom-row">
  13. <Col fixedSpan="12" className="custom-col-sidebar">Sidebar</Col>
  14. <Col className="custom-col-content">
  15. <Tab>
  16. {
  17. tabs.map(item => <Tab.Item key={item.key} title={item.tab}>{item.content}</Tab.Item>)
  18. }
  19. </Tab>
  20. </Col>
  21. </Row>
  22. </div>
  23. , mountNode);
  1. .custom-row {
  2. border: 1px solid #ccc;
  3. }
  4. .custom-col-sidebar {
  5. border-right: 1px solid #ccc;
  6. height: 130px;
  7. line-height: 130px;
  8. text-align: center;
  9. }
  10. .custom-col-content {
  11. overflow: hidden;
  12. }

选项卡嵌套

可以将不同类型的选项卡进行嵌套

Tab 选项卡 - 图15

查看源码在线预览

  1. import { Tab } from '@alifd/next';
  2. function callback(key) {
  3. console.log(key);
  4. }
  5. ReactDOM.render(
  6. <Tab onChange={callback} shape="wrapped">
  7. <Tab.Item title="Tab 1" key="1">
  8. <Tab shape="wrapped">
  9. <Tab.Item title="1-1" key="11">1-1</Tab.Item>
  10. <Tab.Item title="1-2" key="12">1-2</Tab.Item>
  11. <Tab.Item title="1-3" key="13">1-3</Tab.Item>
  12. </Tab>
  13. </Tab.Item>
  14. <Tab.Item title="Tab 2" key="2">
  15. <Tab shape="pure">
  16. <Tab.Item title="2-1" key="21">2-1</Tab.Item>
  17. <Tab.Item title="2-2" key="22">2-2</Tab.Item>
  18. <Tab.Item title="3-3" key="23">2-3</Tab.Item>
  19. </Tab>
  20. </Tab.Item>
  21. <Tab.Item title="Tab 3" key="3">
  22. <Tab shape="capsule">
  23. <Tab.Item title="3-1" key="31">3-1</Tab.Item>
  24. <Tab.Item title="3-2" key="32">3-2</Tab.Item>
  25. <Tab.Item title="3-3" key="33">3-3</Tab.Item>
  26. </Tab>
  27. </Tab.Item>
  28. <Tab.Item title="Tab 4" key="4">
  29. <Tab shape="text">
  30. <Tab.Item title="4-1" key="41">4-1</Tab.Item>
  31. <Tab.Item title="4-2" key="42">4-2</Tab.Item>
  32. <Tab.Item title="4-3" key="43">4-3</Tab.Item>
  33. </Tab>
  34. </Tab.Item>
  35. </Tab>
  36. , mountNode);
  1. .next-tabs-content {
  2. color: #333;
  3. font-size: 12px;
  4. padding: 12px;
  5. }

相关区块

Tab 选项卡 - 图16

暂无相关区块