| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905 |
- import React, { useState } from 'react';
- import Tabs from '../index';
- import Button from '@douyinfe/semi-ui/button/index';
- import Typography from '@douyinfe/semi-ui/typography/index';
- import Switch from '@douyinfe/semi-ui/switch/index';
- import { Radio, RadioGroup } from '@douyinfe/semi-ui';
- import Icon from '../../icons';
- import { IconFile, IconGlobe, IconHelpCircle } from '@douyinfe/semi-icons';
- const TabPane = Tabs.TabPane;
- const { Title } = Typography;
- export default {
- title: 'Tabs'
- }
- const style = {
- width: '600px',
- margin: '20px',
- };
- const onChange = activeKey => {
- console.log('onChange: activeKey =>', activeKey);
- };
- const onTabClick = (activeKey, event) => {
- console.log('onTabClick: onTabClick =>', activeKey);
- };
- const operations = (
- <Button
- onClick={() => {
- alert('you have clicked me!');
- }}
- >
- Extra Action
- </Button>
- );
- class App extends React.Component {
- render() {
- return (
- <div>
- <Tabs type="line">
- <TabPane tab="文档" itemKey="1">
- <h3>文档</h3>
- <p
- style={{
- lineHeight: 1.8,
- }}
- >
- Semi Design 是由互娱社区前端团队与 UED
- 团队共同设计开发并维护的设计系统。设计系统包含设计语言以及一整套可复用的前端组件,帮助设计师与开发者更容易地打造高质量的、用户体验一致的、符合设计规范的
- Web 应用。
- </p>
- <p
- style={{
- lineHeight: 1.8,
- }}
- >
- 区别于其他的设计系统而言,Semi Design
- 以用户中心、内容优先、设计人性化为设计理念,具有以下优势:
- </p>
- <ul>
- <li>
- <p>Semi Design 以内容优先进行设计。</p>
- </li>
- <li>
- <p>更容易地自定义主题。</p>
- </li>
- <li>
- <p>适用国际化场景。</p>
- </li>
- <li>
- <p>效率场景加入人性化关怀。</p>
- </li>
- </ul>
- <h3>文档</h3>
- <p
- style={{
- lineHeight: 1.8,
- }}
- >
- Semi Design 是由互娱社区前端团队与 UED
- 团队共同设计开发并维护的设计系统。设计系统包含设计语言以及一整套可复用的前端组件,帮助设计师与开发者更容易地打造高质量的、用户体验一致的、符合设计规范的
- Web 应用。
- </p>
- <p
- style={{
- lineHeight: 1.8,
- }}
- >
- 区别于其他的设计系统而言,Semi Design
- 以用户中心、内容优先、设计人性化为设计理念,具有以下优势:
- </p>
- <ul>
- <li>
- <p>Semi Design 以内容优先进行设计。</p>
- </li>
- <li>
- <p>更容易地自定义主题。</p>
- </li>
- <li>
- <p>适用国际化场景。</p>
- </li>
- <li>
- <p>效率场景加入人性化关怀。</p>
- </li>
- </ul>
- </TabPane>
- <TabPane tab="快速起步" itemKey="2">
- <h3>快速起步</h3>
- <p
- style={{
- lineHeight: 1.8,
- }}
- >
- 如果是全新的项目,建议你使用 eden 初始化项目,初始化项目类型选择 react
- </p>
- <pre
- style={{
- margin: '24px 0',
- padding: '20px',
- border: 'none',
- whiteSpace: 'normal',
- borderRadius: '6px',
- color: 'var(--semi-color-text-1)',
- backgroundColor: 'var(--semi-color-fill-0)',
- }}
- >
- <code></code>
- </pre>
- </TabPane>
- <TabPane tab="帮助" itemKey="3">
- <h3>帮助</h3>
- <p
- style={{
- lineHeight: 1.8,
- color: 'var(--semi-color-text-0)',
- fontWeight: 600,
- }}
- >
- Q:有新组件需求、或者现有组件feature不能满足业务需求?
- </p>
- <p
- style={{
- lineHeight: 1.8,
- color: 'var(--semi-color-text-1)',
- }}
- >
- 右上角问题反馈,提交issue,label选择Feature Request / New Component Request
- 我们会高优处理这些需求。
- </p>
- <p
- style={{
- lineHeight: 1.8,
- color: 'var(--semi-color-text-0)',
- fontWeight: 600,
- }}
- >
- Q:对组件的使用有疑惑?
- </p>
- <p
- style={{
- lineHeight: 1.8,
- color: 'var(--semi-color-text-1)',
- }}
- >
- 欢迎进我们的客服lark群进行咨询提问。
- </p>
- </TabPane>
- </Tabs>
- </div>
- );
- }
- }
- export const Level1NoIcon = () => (
- <div
- style={{
- width: 500,
- height: 500,
- margin: 50,
- }}
- >
- <App />
- </div>
- );
- Level1NoIcon.story = {
- name: 'Level 1-无图标',
- };
- export const DefaultActiveKeyDemo = () => (
- <Tabs style={style} defaultActiveKey="3" onChange={onChange} onTabClick={onTabClick}>
- <TabPane tab="文档" itemKey="1">
- <span>文档</span>
- </TabPane>
- <TabPane tab="快速起步" itemKey="2">
- 快速起步
- </TabPane>
- <TabPane tab="帮助" itemKey="3">
- 帮助
- </TabPane>
- <TabPane tab="关于" itemKey="4">
- 关于
- </TabPane>
- <TabPane tab="资源工具" itemKey="5">
- 资源工具
- </TabPane>
- </Tabs>
- );
- DefaultActiveKeyDemo.story = {
- name: '指定defaultActiveKey',
- };
- export const Level1WithIcon = () => (
- <Tabs style={style} defaultActiveKey="1" onChange={onChange} onTabClick={onTabClick}>
- <TabPane
- tab={
- <span>
- <IconFile />
- 文档
- </span>
- }
- itemKey="1"
- >
- 文档
- </TabPane>
- <TabPane
- tab={
- <span>
- <IconGlobe />
- 快速起步
- </span>
- }
- itemKey="2"
- >
- 快速起步
- </TabPane>
- <TabPane
- tab={
- <span>
- <IconHelpCircle />
- 帮助
- </span>
- }
- itemKey="3"
- >
- 帮助
- </TabPane>
- </Tabs>
- );
- Level1WithIcon.story = {
- name: 'Level 1-有图标',
- };
- export const Level1WithTabBarExtraContent = () => (
- <Tabs style={style} defaultActiveKey="1" tabBarExtraContent={operations}>
- <TabPane tab="文档" itemKey="1">
- 文档
- </TabPane>
- <TabPane tab="快速起步" itemKey="2">
- 快速起步
- </TabPane>
- <TabPane tab="帮助" itemKey="3">
- 帮助
- </TabPane>
- <TabPane tab="关于" itemKey="4">
- 关于
- </TabPane>
- <TabPane tab="资源工具" itemKey="5">
- 资源工具
- </TabPane>
- </Tabs>
- );
- Level1WithTabBarExtraContent.story = {
- name: 'Level 1-导航内容扩展',
- };
- export const RenderTabBar = () => (
- <Tabs
- style={style}
- defaultActiveKey="1"
- renderTabBar={(tabBarProps, DefaultTabBar) => {
- return (
- <div className="tab-bar-box" itemKey="bar">
- 这是二次封装的Tab Bar,当前ActiveKey:{tabBarProps.activeKey}
- <DefaultTabBar {...tabBarProps} />
- </div>
- );
- }}
- >
- <TabPane tab="文档" itemKey="1">
- 文档
- </TabPane>
- <TabPane tab="快速起步" itemKey="2">
- 快速起步
- </TabPane>
- <TabPane tab="帮助" itemKey="3">
- 帮助
- </TabPane>
- <TabPane tab="关于" itemKey="4">
- 关于
- </TabPane>
- <TabPane tab="资源工具" itemKey="5">
- 资源工具
- </TabPane>
- </Tabs>
- );
- RenderTabBar.story = {
- name: 'Level 1-导航二次封装',
- };
- export const DisabledTab = () => (
- <Tabs style={style} defaultActiveKey="1">
- <TabPane tab="文档" itemKey="1">
- 文档
- </TabPane>
- <TabPane tab="快速起步" itemKey="2">
- 快速起步
- </TabPane>
- <TabPane tab="帮助" itemKey="3" disabled>
- 帮助
- </TabPane>
- <TabPane tab="关于" itemKey="4" disabled>
- 关于
- </TabPane>
- <TabPane tab="资源工具" itemKey="5">
- 资源工具
- </TabPane>
- </Tabs>
- );
- DisabledTab.story = {
- name: 'Level 1-不可点击Tab',
- };
- export const Level2Card = () => (
- <Tabs style={style} defaultActiveKey="1" type="card">
- <TabPane tab="文档" itemKey="1">
- 文档
- </TabPane>
- <TabPane tab="快速起步" itemKey="2">
- 快速起步
- </TabPane>
- <TabPane tab="帮助" itemKey="3">
- 帮助
- </TabPane>
- <TabPane tab="关于" itemKey="4">
- 关于
- </TabPane>
- <TabPane tab="资源工具" itemKey="5">
- 资源工具
- </TabPane>
- </Tabs>
- );
- Level2Card.story = {
- name: 'Level 2-卡片Tab',
- };
- export const Level3ButtonTab = () => (
- <Tabs style={style} defaultActiveKey="1" type="button">
- <TabPane tab="文档" itemKey="1">
- 文档
- </TabPane>
- <TabPane tab="快速起步" itemKey="2">
- 快速起步
- </TabPane>
- <TabPane tab="帮助" itemKey="3">
- 帮助
- </TabPane>
- <TabPane tab="关于" itemKey="4">
- 关于
- </TabPane>
- <TabPane tab="资源工具" itemKey="5">
- 资源工具
- </TabPane>
- </Tabs>
- );
- Level3ButtonTab.story = {
- name: 'Level 3-按钮Tab',
- };
- class TabDemo extends React.Component {
- constructor() {
- super();
- this.state = {
- itemKey: '1',
- };
- this.onTabClick = this.onTabClick.bind(this);
- }
- onTabClick(itemKey, type) {
- this.setState({
- [type]: itemKey,
- });
- }
- render() {
- const contentList = [
- <div>文档</div>,
- <div>快速起步</div>,
- <div>帮助</div>,
- <div>关于</div>,
- <div>资源工具</div>,
- ];
- const tabList = [
- {
- tab: '文档',
- itemKey: '1',
- },
- {
- tab: '快速起步',
- itemKey: '2',
- },
- {
- tab: '帮助',
- itemKey: '3',
- },
- {
- tab: '关于',
- itemKey: '4',
- },
- {
- tab: '资源工具',
- itemKey: '5',
- },
- ];
- return (
- <Tabs
- style={style}
- type="line"
- tabList={tabList}
- onTabClick={itemKey => {
- this.onTabClick(itemKey, 'itemKey');
- }}
- >
- {contentList[this.state.itemKey]}
- <span>test</span>
- <span>test2</span>
- </Tabs>
- );
- }
- }
- export const TabList = () => <TabDemo />;
- TabList.story = {
- name: 'tabList',
- };
- class TabDemo2 extends React.Component {
- constructor() {
- super();
- this.state = {
- key: '1',
- };
- this.onTabClick = this.onTabClick.bind(this);
- }
- onTabClick(val) {
- console.log('key', val);
- this.setState({
- key: val,
- });
- }
- render() {
- return (
- <Tabs type="line" activeKey={this.state.key} onChange={val => this.onTabClick(val)}>
- <TabPane tab="文档" itemKey="1">
- 文档
- </TabPane>
- <TabPane tab="快速起步" itemKey="2">
- 快速起步
- </TabPane>
- <TabPane tab="帮助" itemKey="3">
- 帮助
- </TabPane>
- <TabPane tab="关于" itemKey="4">
- 关于
- </TabPane>
- <TabPane tab="资源工具" itemKey="5">
- 资源工具
- </TabPane>
- </Tabs>
- );
- }
- }
- export const ActiveKey = () => <TabDemo2 />;
- ActiveKey.story = {
- name: 'activeKey',
- };
- class TabDemo3 extends React.Component {
- constructor() {
- super();
- this.state = {
- key: '1',
- type: 'here',
- };
- }
- onTabClick(val) {
- console.log('key', val);
- this.setState({
- key: val,
- type: 'search',
- });
- }
- render() {
- let type = this.state.type;
- return (
- <Tabs type="line" activeKey={this.state.key} onChange={val => this.onTabClick(val)}>
- <TabPane tab="文档" itemKey="1">
- 文档
- </TabPane>
- <TabPane tab="快速起步" itemKey="2">
- 快速起步
- </TabPane>
- {type === 'search' && (
- <TabPane tab="搜索" itemKey="3">
- 搜索
- </TabPane>
- )}
- </Tabs>
- );
- }
- }
- export const Dynamic = () => <TabDemo3 />;
- class TabDemo4 extends React.Component {
- constructor() {
- super();
- this.state = {
- loading: true,
- };
- }
- updateTab = () => {
- this.setState({
- loading: !this.state.loading,
- });
- this.tab = Math.random();
- };
- render() {
- let type = this.state.type;
- return (
- <div>
- <Button onClick={() => this.updateTab()}>change</Button>
- <Tabs type="line">
- <TabPane tab={this.tab} itemKey="1">
- 文档
- </TabPane>
- <TabPane tab="快速起步" itemKey="2">
- 快速起步
- </TabPane>
- {type === 'search' && (
- <TabPane tab="搜索" itemKey="3">
- 搜索
- </TabPane>
- )}
- </Tabs>
- </div>
- );
- }
- }
- export const Update = () => <TabDemo4 />;
- export const RenderCurrentPane = () => (
- <Tabs style={style} keepDOM={false}>
- <TabPane tab="文档" itemKey="1">
- <span>文档</span>
- </TabPane>
- <TabPane tab="快速起步" itemKey="2">
- 快速起步
- </TabPane>
- <TabPane tab="帮助" itemKey="3">
- 帮助
- </TabPane>
- <TabPane tab="关于" itemKey="4">
- 关于
- </TabPane>
- <TabPane tab="资源工具" itemKey="5">
- 资源工具
- </TabPane>
- </Tabs>
- );
- RenderCurrentPane.story = {
- name: '只渲染当前pane'
- }
- export const LazyRender = () => (
- <Tabs style={style} lazyRender>
- <TabPane tab="文档" itemKey="1">
- <span>文档</span>
- </TabPane>
- <TabPane tab="快速起步" itemKey="2">
- 快速起步
- </TabPane>
- <TabPane tab="帮助" itemKey="3">
- 帮助
- </TabPane>
- <TabPane tab="关于" itemKey="4">
- 关于
- </TabPane>
- <TabPane tab="资源工具" itemKey="5">
- 资源工具
- </TabPane>
- </Tabs>
- );
- LazyRender.story = {
- name: '懒渲染'
- }
- export const VerticalTabs = () => (
- <Tabs style={style} tabPosition="left">
- <TabPane tab="文档" itemKey="1">
- <span>文档</span>
- </TabPane>
- <TabPane tab="快速起步" itemKey="2">
- 快速起步
- </TabPane>
- <TabPane tab="帮助" itemKey="3">
- 帮助
- </TabPane>
- <TabPane tab="关于" itemKey="4">
- 关于
- </TabPane>
- <TabPane tab="资源工具" itemKey="5">
- 资源工具
- </TabPane>
- </Tabs>
- );
- VerticalTabs.story = {
- name: '垂直的tabs'
- }
- export const HorizontalTabs = () => (
- <Tabs style={style} tabPosition="left" type="card">
- <TabPane tab="文档" itemKey="1">
- <span>文档</span>
- </TabPane>
- <TabPane tab="快速起步" itemKey="2">
- 快速起步
- </TabPane>
- <TabPane tab="帮助" itemKey="3">
- 帮助
- </TabPane>
- <TabPane tab="关于" itemKey="4">
- 关于
- </TabPane>
- <TabPane tab="资源工具" itemKey="5">
- 资源工具
- </TabPane>
- </Tabs>
- );
- HorizontalTabs.story = {
- name: '垂直的tabs - 卡片',
- };
- export const VerticalTabsButton = () => (
- <Tabs style={style} tabPosition="left" type="button">
- <TabPane tab="文档" itemKey="1">
- <span>文档</span>
- </TabPane>
- <TabPane tab="快速起步" itemKey="2">
- 快速起步
- </TabPane>
- <TabPane tab="帮助" itemKey="3">
- 帮助
- </TabPane>
- <TabPane tab="关于" itemKey="4">
- 关于
- </TabPane>
- <TabPane tab="资源工具" itemKey="5">
- 资源工具
- </TabPane>
- </Tabs>
- );
- VerticalTabsButton.story = {
- name: '垂直的tabs - 按钮',
- };
- export const CollapseTabs = () => (
- <div>
- <Tabs
- style={{
- width: '60%',
- margin: '20px',
- }}
- type="card"
- collapsible
- >
- {[...Array(30).keys()].map(i => (
- <TabPane tab={`Tab-${i}`} itemKey={`Tab-${i}`}>
- Content of card tab {i}
- </TabPane>
- ))}
- </Tabs>
- <br />
- <br />
- <Tabs style={style} type="button" collapsible>
- {[...Array(30).keys()].map(i => (
- <TabPane tab={`Tab-${i}`} itemKey={`${i}`}>
- Content of button tab {i}
- </TabPane>
- ))}
- </Tabs>
- <br />
- <br />
- <Tabs style={style} type="line" collapsible>
- {[...Array(30).keys()].map(i => (
- <TabPane tab={`Tab-${i}`} itemKey={`${i}`}>
- Content of line tab {i}
- </TabPane>
- ))}
- </Tabs>
- </div>
- );
- CollapseTabs.story = {
- name: '折叠的tabs'
- }
- const TabSizeDemo = () => {
- const typeList = ['line'];
- const [size, setSize] = useState('large');
- const [vertical, setVertical] = useState(false);
- return (
- <div>
- <RadioGroup onChange={e => setSize(e.target.value)} value={size}>
- <Radio value={'small'}>small</Radio>
- <Radio value={'medium'}>medium</Radio>
- <Radio value={'large'}>large</Radio>
- </RadioGroup>
- <div
- style={{
- display: 'flex',
- alignItems: 'center',
- }}
- >
- <Title
- heading={6}
- style={{
- margin: 8,
- }}
- >
- {vertical ? '垂直' : '水平'}
- </Title>
- <Switch checked={vertical} onChange={setVertical} />
- </div>
- {typeList.map((type, index) => {
- return (
- <Tabs
- style={{
- width: '60%',
- margin: '20px',
- }}
- type={type}
- size={size}
- key={index}
- tabPosition={vertical ? 'left' : 'top'}
- >
- {[...Array(3).keys()].map(i => (
- <TabPane tab={`Tab-${i}`} itemKey={`Tab-${i}`}>
- Content of {type} tab {i}
- </TabPane>
- ))}
- </Tabs>
- );
- })}
- <br />
- <br />
- </div>
- );
- };
- export const TabSize = () => <TabSizeDemo />;
- TabSize.story = {
- name: 'tab size',
- };
- class TabListChangeDemo extends React.Component {
- constructor() {
- super();
- this.state = {
- itemKey: '1',
- tabList:[
- {
- tab: '文档',
- itemKey: '1',
- },
- {
- tab: '快速起步',
- itemKey: '2',
- },
- {
- tab: '帮助',
- itemKey: '3',
- },
- {
- tab: '关于',
- itemKey: '4',
- },
- {
- tab: '资源工具',
- itemKey: '5',
- },
- ]
- };
- this.onTabClick = this.onTabClick.bind(this);
- }
- onTabClick(itemKey, type) {
- this.setState({
- [type]: itemKey,
- tabList: [{
- tab: '文档',
- itemKey: '1',
- }]
- });
- }
- render() {
- const contentList = [
- <div>文档</div>,
- <div>快速起步</div>,
- <div>帮助</div>,
- <div>关于</div>,
- <div>资源工具</div>,
- ];
- return (
- <Tabs
- style={style}
- type="line"
- tabList={this.state.tabList}
- onTabClick={itemKey => {
- this.onTabClick(itemKey, 'itemKey');
- }}
- >
- {contentList[this.state.itemKey]}
- <span>test</span>
- <span>test2</span>
- </Tabs>
- );
- }
- }
- export const TabListChange = () => <TabListChangeDemo />;
- TabListChange.story = {
- name: 'tablist change',
- };
- class TabClosableDemo extends React.Component {
- constructor(props){
- super(props);
- this.state = {
- tabList: [
- {tab: '文档', itemKey:'1', text:'文档', closable:true},
- {tab: '快速起步', itemKey:'2', text:'快速起步', closable:true},
- {tab: '帮助', itemKey:'3', text:'帮助'},
- ]
- }
- }
- close(key){
- const newTabList = [...this.state.tabList];
- const closeIndex = newTabList.findIndex(t=>t.itemKey===key);
- newTabList.splice(closeIndex, 1);
- this.setState({tabList:newTabList});
- }
- render() {
- return (
- <Tabs type="card" defaultActiveKey="1" onTabClose={this.close.bind(this)}>
- {
- this.state.tabList.map(t=><TabPane closable={t.closable} tab={t.tab} itemKey={t.itemKey} key={t.itemKey}>{t.text}</TabPane>)
- }
- </Tabs>
- );
- }
- }
- export const TabClosable = () => <TabClosableDemo />;
- TabClosable.story = {
- name: 'tab closable',
- };
|