React實現Antd的tabs切換——選項卡切換組件


一.組件代碼

tabs/index.tsx文件

import React, { useState } from 'react';
import { TabBar, TabContent, TabBarItem } from './styled';
interface PropsInter {
  defaultActiveKey?: any;
  disabled?: boolean;
  onChange?: (activeKey: any) => any;
}

function TabPane(props: any) {
  return <div>{props.children}</div>;
}

function Tabs(props: PropsInter) {
  const [currentIndex, setCurrentIndex] = useState(props.defaultActiveKey);

  const onChange = (activeKey: any) => {
    if (typeof props.onChange === 'function') props.onChange(activeKey);
    setCurrentIndex(activeKey);
  };

  return (
    <div style={{ overflow: 'hidden' }}>
      <TabBar>
        {React.Children.map(props.children, (element, index) => {
          let { disabled, tab } = element.props;
          return (
            <TabBarItem
              className={currentIndex === element.key ? 'active' : ''}
              onClick={() => onChange(element.key)}
              key={element.key}
              disabled={disabled}
            >
              {tab}
            </TabBarItem>
          );
        })}
      </TabBar>
      <TabContent>
        {React.Children.map(props.children, (element, index) => {
          return (
            <div
              key={element.key}
              style={{
                display: currentIndex === element.key ? 'block' : 'none',
              }}
            >
              {element}
            </div>
          );
        })}
      </TabContent>
    </div>
  );
}
export { Tabs, TabPane };

tabs/styled.ts文件

import styled from 'styled-components';
import { Button } from 'antd';
export const TabBar = styled.div`
  background: #fff;
  padding: 8px 16px;
  z-index: 1;
  flex-shrink: 0;
  display: flex;
  position: relative;
`;

export const TabBarItem = styled(Button)`
  margin: 0 34px 0 0;
  padding: 12px 0px;
  font-size: 14px;
  display: flex;
  justify-content: center;
  align-items: center;
  box-sizing: border-box;
  border: none;
  box-shadow: none;
  &.active,
  &.hover {
    color: #108ee9;
    border-bottom: 2px solid #1890ff;
  }
`;

export const TabContent = styled.div`
  background: #fff;
  display: flex;
  flex: 1;
  height: 100%;
  div {
    flex-shrink: 0;
    width: 100%;
    overflow-y: auto;
  }
`;  

二.使用組件:

import React from 'react';
import { Tabs, TabPane } from './tabs';
export interface BasicLayoutProps {}
const BasicLayout: React.FC<BasicLayoutProps> = props => {
  const { children } = props;
  return (
    <>
      <Tabs
        defaultActiveKey="1"
        onChange={activeKey => console.log('activeKey', activeKey)}
      >
        <div tab="A00000" key="1">
          <TabPane>A 選修卡的內容</TabPane>
        </div>
        <TabPane tab="B" key="2">
          B 選修卡的內容
        </TabPane>
        <TabPane tab="399999" key="3">
          c 選修卡的內容
        </TabPane>
      </Tabs>
    </>
  );
};
export default BasicLayout;

三.結果圖解:

四.組件內容詳解

1.Tabs組件控制tab欄切換  TabPane展示tab真實內容

2.React.Children.map結構:React.Children.map(object children,callback)

如:React.Children.map(props.children, (element, index) => {}

props.children:=>子元素集合數組 這里是Tabs里面的內容

 

element:=>子組件數組的每一個子項  這里是每一個TabPane里面的內容

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM