[React Bootstrap] Tabs を表示してみる | 心を無にして始める React
今回は、Tab コンポーネントを表示します。
準備
まだ components フォルダがなければ作ります。
src
を右クリックして New Folder
。
components と入力してフォルダを作ります。
今回は、components フォルダに Tab のコンポーネントを作って、表示してみます。
公式のドキュメントはここ。
https://react-bootstrap.github.io/components/tabs/
Tabs コンポーネントをつくる
component フォルダに Tabs.js
を作ります。
Tabs.js
を心を無にして編集してみます。
import React from 'react';
import {
Col,
Nav,
Row,
Tab,
Tabs as BootstrapTabs
} from 'react-bootstrap';
function Tabs({
vertical,
defaultActiveKey,
tabs = [
{
id: 'tab-1',
title: 'One',
content: <div>Content 1</div>,
},
{
id: 'tab-2',
title: 'Two',
content: <div>Content 2</div>,
},
{
id: 'tab-3',
title: 'Three',
content: <div>Content 3</div>,
},
],
...otherProps
}) {
if (tabs.length <= 0) {
return undefined;
}
const activeKey = defaultActiveKey || tabs[0].id;
return vertical
? (
<Tab.Container defaultActiveKey={activeKey} {...otherProps}>
<Row>
<Col sm={3}>
<Nav variant="pills" className="flex-column">
{
tabs.map(tab => {
return (
<Nav.Item key={tab.id}>
<Nav.Link eventKey={tab.id} href="#">
{tab.title}
</Nav.Link>
</Nav.Item>
);
})
}
</Nav>
</Col>
<Col sm={9}>
<Tab.Content>
{
tabs.map(tab => {
return (
<Tab.Pane key={tab.id} eventKey={tab.id}>
{tab.content}
</Tab.Pane>
);
})
}
</Tab.Content>
</Col>
</Row>
</Tab.Container>
)
: (
<BootstrapTabs
defaultActiveKey={activeKey}
justify
{...otherProps}
>
{
tabs.map(tab => {
return (
<Tab key={tab.id} eventKey={tab.id} title={tab.title}>
{tab.content}
</Tab>
);
})
}
</BootstrapTabs>
);
}
export default Tabs;
プロジェクトでは、コンポーネントを統一したデザインで利用することが多いです。
そのため、(React Bootstrap のコンポーネントをその場その場でカスタマイズしながら使うよりも、)プロジェクトでコンポーネントにしたものを使うほうが、変更をお手軽に漏れなくできることが多いです。
Tabs コンポーネントを表示する
それでは、 App.js
を編集して Tabs コンポーネントを表示します。
import React from 'react';
import './App.css';
import Tabs from './components/Tabs';
const TABS = [
{
id: 'react',
title: 'React',
content: <div className="p-5 border border-light">A JavaScript library for building user interfaces</div>,
},
{
id: 'angular',
title: 'Angular',
content: <div className="p-5 border border-light">The modern web developer's platform</div>,
},
{
id: 'vue',
title: 'Vue',
content: <div className="p-5 border border-light">The Progressive JavaScript Framework</div>,
},
];
function App() {
return (
<div className="p-5 bg-dark text-light" style={{ minHeight: '100vh' }}>
<div className="p-5">
<Tabs tabs={TABS} />
</div>
<div className="p-5">
<Tabs tabs={TABS} vertical />
</div>
</div>
);
}
export default App;
画面を確認してみます。
はい、できました。