react-tabsによる実装はすごくシンプルな設計で簡単に導入する事が出来る為、初心者でも扱いやすいタブ機能となっております。
個人的にはオススメします、私も度々使用します。
react-tabsのgithubは以下となりますので参照ください。
事前準備
Node.js
npm or yarn
create-react-app
React v17~
実装方法は簡単でございます
CRA(create-react-app)で作成したご自身のプロジェクトにnpmで必要なモジュールをインストールします。
npm install —save react-tabs
yarn add react-tabs
これで準備は完了です、後はApp.js
ファイルで
必要な数のモジュールをインポートしていきましょう。
import { Tab, Tabs, TabList, TabPanel } from 'react-tabs'; import 'react-tabs/style/react-tabs.css';
上記のCSSは元々react-tabsで用意されているCSSが適用されます、なのでCSSも一緒にインポートします。
スタイルをご自身で適用する方法は後ほど解説致します。
まずは簡単なタブコンポーネント実装をしていきます。
簡単実装 Tabs
// App.js const App = () => { return( <Tabs> <TabList> <Tab>HOME</Tab> <Tab>About</Tab> <Tab>Contact</Tab> </TabList> <TabPanel> <h1>HOMEです</h1> </TabPanel> <TabPanel> <h1>Aboutです</h1> </TabPanel> <TabPanel> <h1>Contactです</h1> </TabPanel> </Tabs> ) }
See the Pen React-tabs by dev.K | Webアプリ開発者 (@enjinia_f) on CodePen.
上記の通りすぐに完成です、Vanilla.jsでもタブ実装は可能ですが、React-Tabsは最速実装となっております。
では使い方の説明を致します。
react-tabsの構成はTabs
、TabList
、Tab
、TabPanel
この4つのコンポーネントで構成されています。
これらは複合コンポーネントと言います。
Tabs
Tabsコンポーネントに追加のPropsを指定すると、レンダリング時にそれらのPropsが生成されるルート要素(Wrapper)に適用されます。ルート要素は<div>
として転送されます。
Tabs コンポーネントはタブのセット全体を囲む役割を担います。
TabList
TabListコンポーネントに追加のPropsを指定すると、レンダリング時にそれらのPropsが生成される要素に適用されます。
要素は<ul>
として転送されます。
TabList コンポーネントはタブをまとめる親の役割を担います。
Tab
Tabコンポーネントに追加のPropsを指定すると、レンダリング時にそれらのPropsが生成される要素に適用されます。
要素は<li>
として転送されます。Tabコンポーネントはタブのタイトルやボタンなどを表示する役割を担います。
TabPanel
TabPanelコンポーネントに追加のPropsを指定した場合も、レンダリング時にそれらのPropsが生成される要素に適用されます。
要素は<div>
として転送されます。
ただし、TabPanelの子要素は、Tabコンポーネントと同じ数と順番で表示されます。つまり、TabPanelの子要素の順番はTabListを介してTabによって処理されることに注意してください。
このように、複数のコンポーネントを組み合わせて新しいコンポーネントを作成することで、再利用可能なコンポーネントを作りやすくなります。また、コンポーネントの階層構造を使って、コンポーネントの関連性や親子関係を表現することもできます。
複合コンポーネントを使用することで、コードをより分割して管理しやすくし、可読性と保守性を向上させることができます。また、より柔軟なUIの構築や、複雑な機能の実装にも役立ちます。
では、タブをネスト化してみましょう。
Tabのネスト化
const App = () => { return( <Tabs forceRenderTabPanel defaultIndex={1}> <TabList> <Tab>メインTab</Tab> <Tab>サブTab</Tab> </TabList> <TabPanel> <Tabs forceRenderTabPanel> <TabList> <Tab>タブ1</Tab> <Tab>タブ2</Tab> <Tab>タブ3</Tab> <Tab>タブ4</Tab> </TabList> <TabPanel> <p>タブ1ページ</p> </TabPanel> <TabPanel> <p>タブ2ページ</p> </TabPanel> <TabPanel> <p>タブ3ページ</p> </TabPanel> <TabPanel> <p>タブ4ページ</p> </TabPanel> </Tabs> </TabPanel> <TabPanel> <Tabs forceRenderTabPanel> <TabList> <Tab>タブ5</Tab> <Tab>タブ6</Tab> <Tab>タブ7</Tab> <Tab>タブ8</Tab> </TabList> <TabPanel> <p>タブ5ページ</p> </TabPanel> <TabPanel> <p>タブ6ページ</p> </TabPanel> <TabPanel> <p>タブ7ページ</p> </TabPanel> <TabPanel> <p>タブ8ページ</p> </TabPanel> </Tabs> </TabPanel> </Tabs> ) }
See the Pen React-tabs ネスト by dev.K | Webアプリ開発者 (@enjinia_f) on CodePen.
ネストになると多少複雑化します。
上記のコードは、2つの階層でタブがネストされています。
最初の階層では、TabsとTabPanelコンポーネントが使用されており、それぞれメインのタブとサブタブを表しています。
const App = () => { return( <Tabs forceRenderTabPanel defaultIndex={1}> <TabList> <Tab>メインTab</Tab> <Tab>サブTab</Tab> </TabList> <TabPanel> <Tabs forceRenderTabPanel> <TabList> <Tab>タブ1</Tab> <Tab>タブ2</Tab> <Tab>タブ3</Tab> <Tab>タブ4</Tab> </TabList> <TabPanel> <p>タブ1ページ</p> </TabPanel> <TabPanel> <p>タブ2ページ</p> </TabPanel> <TabPanel> <p>タブ3ページ</p> </TabPanel> <TabPanel> <p>タブ4ページ</p> </TabPanel> </Tabs> </TabPanel> <TabPanel> <Tabs forceRenderTabPanel> // さらにグループ化 <TabList> <Tab>タブ5</Tab> <Tab>タブ6</Tab> <Tab>タブ7</Tab> <Tab>タブ8</Tab> </TabList> <TabPanel> <p>タブ5ページ</p> </TabPanel> <TabPanel> <p>タブ6ページ</p> </TabPanel> <TabPanel> <p>タブ7ページ</p> </TabPanel> <TabPanel> <p>タブ8ページ</p> </TabPanel> </Tabs> </TabPanel> </Tabs> ) }
最初の階層のTabList内には、2つのメインタブが定義されています。1つ目のメインタブにはメインTab
というタイトルがあり、2つ目のメインタブにはサブTab
というタイトルがあります。
TabPanelコンポーネントは、各メインタブに対応するコンテンツを定義しています。最初のメインタブのTabPanel内には、2番目の階層のタブがあります。
2番目の階層のタブについても、同様の構造が繰り返されます。
各メインタブのTabPanel内には、それぞれ異なるタブのセットが定義されています。
例えば、最初のメインタブのTabPanel内には、タブ1
からタブ4
までの4つのタブがあります。
各タブのTabPanel内には、対応するタブのコンテンツが定義されています。
このように、TabsとTabPanelをネストして使用することで、複数の階層のタブを作成することができます。
ユーザーがメインタブを選択すると、そのメインタブに対応するサブタブが表示され、ユーザーはサブタブの中からコンテンツを選択できます。
上記の例では、2つのメインタブとそれぞれのサブタブがありますが、階層の深さやタブの数を必要に応じて変更することができます。
react-tabsにはメインコンテナとして機能する複合コンポーネントがございますので紹介致します。
Props(プロパティ)を渡すことで、タブを無効にしたり、デフォルトのインデックスを設定したりすることもできます。
タブをカスタマイズするために利用できる非常に多くのPropsがございます。
まずはTabsの複合コンポーネントのPropsからいきましょう。
react-tabsに独自のスタイル
react-tabsは基本的には用意されたCSSがありそれをインポートし適用させます。
しかしデフォルトでスタイルは含まれていません。
代わりにコンポーネントは、スタイルを自分で適用するために使用できるレンダリングPropsを介して有用な情報を公開します。
デフォルトのスタイルを無効にする場合は
setUseDefaultStyles
メソッドを使用します。
これは、TabsコンポーネントのPropsとして渡される関数です。
この静的メソッドを1度呼び出すとデフォルトのスタイルを無効化する事が可能となります。
引数にはブール値であるtrue
、false
の設定です
import { Tabs, TabList, Tab, TabPanel } from 'react-tabs'; Tabs.setUseDefaultStyles(false); const ExampleTabs = () => { return ( <Tabs forceRenderTabPanel={true}> <TabList> <Tab>Tab 1</Tab> <Tab>Tab 2</Tab> <Tab>Tab 3</Tab> </TabList> <TabPanel> <p>Content for Tab 1</p> </TabPanel> <TabPanel> <p>Content for Tab 2</p> </TabPanel> <TabPanel> <p>Content for Tab 3</p> </TabPanel> </Tabs> ); }; export default ExampleTabs;
上記の例では、Tabs.setUseDefaultStyles(false)
をコンポーネントの外で呼び出しています。これにより、デフォルトのスタイルが無効になります。
その後、ExampleTabs
コンポーネントの中で Tabs、TabList、Tab、TabPanel コンポーネントを使用してタブセットを作成しています。ただし、デフォルトのスタイルは無効化されているため、タブのスタイルはユーザーが独自に定義する必要があります。
このようにしてTabs.setUseDefaultStyles(false)
を使用すると、デフォルトのスタイルを無効にし、カスタムスタイルを適用することができます。
他の方法も利用することができます。
react-tabsライブラリでは、defaultCSS
プロパティを使用してデフォルトのスタイルを無効にすることができます。以下に例を示します。
import { Tabs, TabList, Tab, TabPanel } from 'react-tabs'; import 'react-tabs/style/react-tabs.css'; function App() { return ( <Tabs defaultCSS={false}> <TabList> <Tab>Tab 1</Tab> <Tab>Tab 2</Tab> <Tab>Tab 3</Tab> </TabList> <TabPanel> <p>Content for Tab 1</p> </TabPanel> <TabPanel> <p>Content for Tab 2</p> </TabPanel> <TabPanel> <p>Content for Tab 3</p> </TabPanel> </Tabs> ); } export default App;
上記の例では、defaultCSS
プロパティをfalse
に設定しています。これにより、デフォルトのスタイルシートが無効化されます。
また、import 'react-tabs/style/react-tabs.css';
を使用して、react-tabsライブラリが提供するデフォルトのスタイルシートをインポートしています。
これにより、カスタムスタイルを適用する前に、必要なスタイリングの基礎が整います。
この方法を使用すると、Tabs コンポーネントでデフォルトのスタイルを無効にし、独自のスタイルを適用することができます。
forceRenderTabPanel
TabsにあるforceRenderTabPanel defaultIndex={1}
forceRenderTabPanelはデフォルトのreact-tabsでは選択したタブのコンテンツのみをレンダリングしコンポーネントをデフォルトでの動作を制御モードにします。
引数は基本的にはブール値となります。
import { Tabs, TabList, Tab, TabPanel } from 'react-tabs'; const ExampleTabs = () => { return ( <Tabs forceRenderTabPanel={true}> <TabList> <Tab>Tab 1</Tab> <Tab>Tab 2</Tab> <Tab>Tab 3</Tab> </TabList> <TabPanel> <p>Content for Tab 1</p> </TabPanel> <TabPanel> <p>Content for Tab 2</p> </TabPanel> <TabPanel> <p>Content for Tab 3</p> </TabPanel> </Tabs> ); }; export default ExampleTabs;
上記のコードでは、ExampleTabs
コンポーネントが定義されています。
ExampleTabs
コンポーネント内には、Tabs、TabList、Tab、TabPanelコンポーネントが使用されています。
Tabsコンポーネントは、タブのセット全体を表します。forceRenderTabPanel
プロパティをtrue
に設定することで、すべてのTabPanelコンポーネントが初期レンダリングされます。
TabListコンポーネントは、タブのリストを表示するための親要素です。Tabコンポーネントは、各タブを表し、タイトルやボタンなどを表示します。
TabPanelコンポーネントは、タブのコンテンツを表示するためのコンポーネントです。Tab コンポーネントと同じ数と順番で配置され、対応するタブと関連付けられます。
各TabPanel内には、対応するタブに関連するコンテンツを表示するための要素(ここでは <p>
要素)を配置しています。
これによって、タブのセットをレンダリングし、すべてのタブパネルが初期表示されるようになります。
これはタブ間のアニメーションなどでは役に立つ場合があります。
defaultIndex
デフォルトで選択されているタブを変更します。
defaultIndexのインデックス番号はデフォルトでは0
となります。
2番目は1と続きます。
これはreact-tabsが現在選択されているタブを内部で処理する場合にのみ非制御モードで使用できます。
そのためselectedIndexと一緒に使用することはできません。
import { Tab, TabList, TabPanel, Tabs } from 'react-tabs'; import 'react-tabs/style/react-tabs.css'; const ExampleTabs = () => { return ( <Tabs defaultIndex={1}> <TabList> <Tab>Title 1</Tab> <Tab>Title 2</Tab> <Tab>Title 3</Tab> </TabList> <TabPanel> <h2>Content 1</h2> </TabPanel> <TabPanel> <h2>Content 2</h2> </TabPanel> <TabPanel> <h2>Content 3</h2> </TabPanel> </Tabs> ); }; export default ExampleTabs;
上記の例では、Tabs
コンポーネントのdefaultIndex
プロパティを1
に設定しています。これにより、最初に表示されるタブのインデックスを指定しています(0から始まるインデックスです)。
TabList内に表示される各Tabは、タブのタイトルを表しています。TabPanel内に表示される各コンテンツは、それぞれのタブに関連するコンテンツを表しています。
defaultIndexプロパティを使用して最初に表示されるタブを制御することができます。指定したインデックスに対応するタブとコンテンツが初期表示されます。
disableUpDownKeys: bool
デフォルトではfalseとなっています。
タブを変更するには、上下の矢印キーを無効にします。
マウントする事に、DOMノードを受け取るコールバックを登録します。
また、アンマウント時にはnull
を受け取ります。
import { Tab, TabList, TabPanel, Tabs } from 'react-tabs'; import 'react-tabs/style/react-tabs.css'; const ExampleTabs = () => { return ( <Tabs disableUpDownKeys={true}> <TabList> <Tab>Title 1</Tab> <Tab>Title 2</Tab> <Tab>Title 3</Tab> </TabList> <TabPanel> <h2>Content 1</h2> </TabPanel> <TabPanel> <h2>Content 2</h2> </TabPanel> <TabPanel> <h2>Content 3</h2> </TabPanel> </Tabs> ); }; export default ExampleTabs;
上記の例では、Tabs
コンポーネントのdisableUpDownKeys
プロパティをtrue
に設定しています。これにより、キーボードの上下矢印キーによるタブの切り替えを無効にします。
TabList
内に表示される各Tabは、タブのタイトルを表しています。TabPanel
内に表示される各コンテンツは、それぞれのタブに関連するコンテンツを表しています。
この例を参考に、disableUpDownKeysプロパティを使用して、キーボードによるタブの切り替えを制御することができます。
onSelect
このイベントハンドラーは、タブ<Tab>
が変更されるたびに呼び出されます。
つまりタブが選択されたときに呼び出される関数です。
引数として渡さるのはtabName
になります。
制御モードでは、onSelectハンドラーは必須のPropsとなります。
import { Tab, TabList, TabPanel, Tabs } from 'react-tabs'; import 'react-tabs/style/react-tabs.css'; const ExampleTabs = () => { const onSelect = (tabIndex) => { console.log('Selecting tab', tabIndex); }; return ( <Tabs onSelect={onSelect}> <TabList> <Tab>Title 1</Tab> <Tab>Title 2</Tab> <Tab>Title 3</Tab> </TabList> <TabPanel> <h2>Content 1</h2> </TabPanel> <TabPanel> <h2>Content 2</h2> </TabPanel> <TabPanel> <h2>Content 3</h2> </TabPanel> </Tabs> ); }; export default ExampleTabs;
上記の例では、TabsコンポーネントのonSelect
プロパティにonSelect
関数を渡しています。onSelect
関数は、タブが選択された際に呼び出されます。
onSelect
関数内では、選択されたタブのインデックスが引数として渡されます。この例では、選択されたタブのインデックスをコンソールに出力しています。
TabList内に表示される各Tabは、タブのタイトルを表しています。TabPanel内に表示される各コンテンツは、それぞれのタブに関連するコンテンツを表しています。
onSelectプロパティを使用してタブの選択時の処理をカスタマイズすることができます。具体的な処理はonSelect関数内で定義し、選択されたタブの情報を活用することができます。
selectedIndex
インデックスを持つタブ<Tab>
が選択されます
index(数値)はデフォルトでは0となります。
import { Tab, TabList, TabPanel, Tabs } from 'react-tabs'; import 'react-tabs/style/react-tabs.css'; const ExampleTabs = () => { const selectedIndex = 1; return ( <Tabs selectedIndex={selectedIndex}> <TabList> <Tab>Title 1</Tab> <Tab>Title 2</Tab> <Tab>Title 3</Tab> </TabList> <TabPanel> <h2>Content 1</h2> </TabPanel> <TabPanel> <h2>Content 2</h2> </TabPanel> <TabPanel> <h2>Content 3</h2> </TabPanel> </Tabs> ); }; export default ExampleTabs;
上記の例では、TabsコンポーネントのselectedIndex
プロパティを1に設定しています。これにより、初期表示時に2番目のタブが選択されます(0から始まるインデックス)。
TabList内に表示される各Tabは、タブのタイトルを表しています。TabPanel内に表示される各コンテンツは、それぞれのタブに関連するコンテンツを表しています。
この例を参考に、selectedIndex
プロパティを使用して初期表示時の選択されたタブを制御することができます。指定したインデックスに対応するタブが選択された状態で表示されます。
以下からは、TabListの複合コンポーネントを解説していきます。
disabledTabClassName
タブが無効になっている場合付けられるカスタムクラスとなります。
タブを無効にするにはdisabled
を使用します
無効になっているタブはマウスで選択できません。
また、キーボードを使用してタブリストをナビゲートするときにスキップされます。
<TabList> <Tab>Tab 1</Tab> <Tab disabled={true}>Tab 2</Tab> <Tab>Tab 3</Tab> </TabList>
プロパティをtrue
設定すれば無効となります。
タブの外側にカスタムクラス名を指定します。
import { Tab, TabList, TabPanel, Tabs } from 'react-tabs'; import 'react-tabs/style/react-tabs.css'; const ExampleTabs = () => { return ( <Tabs> <TabList disabledTabClassName="myDisabledClass"> <Tab>Tab 1</Tab> <Tab disabled={true}>Tab 2</Tab> <Tab>Tab 3</Tab> </TabList> <TabPanel> <h2>Content 1</h2> </TabPanel> <TabPanel> <h2>Content 2</h2> </TabPanel> <TabPanel> <h2>Content 3</h2> </TabPanel> </Tabs> ); }; export default ExampleTabs;
上記の例では、TabListコンポーネントにdisabledTabClassName
プロパティを設定しています。このプロパティには、無効化されたタブに適用するためのクラス名を指定します。
TabList内に表示される各Tabは、タブのタイトルを表しています。2番目のタブはdisabledプロパティをtrueに設定して無効化されています。
disabledTabClassName
プロパティを指定することで、無効化されたタブに指定したクラス名が適用されます。これにより、スタイリングや視覚的な変更を適用することができます。
また以下のように、クラス名の配列またはクラス名がキーであり、値が名前を追加する必要があるかどうかを示すブール値であるオブジェクトを指定することも可能です。
import { Tab, TabList, TabPanel, Tabs } from 'react-tabs'; import 'react-tabs/style/react-tabs.css'; const ExampleTabs = () => { const disabledTabs = { 'tab2': true, 'tab4': true }; return ( <Tabs> <TabList disabledTabClassName={['myDisabledClass1', 'myDisabledClass2']} disabledTabs={disabledTabs}> <Tab>Tab 1</Tab> <Tab>Tab 2</Tab> <Tab>Tab 3</Tab> <Tab>Tab 4</Tab> </TabList> <TabPanel> <h2>Content 1</h2> </TabPanel> <TabPanel> <h2>Content 2</h2> </TabPanel> <TabPanel> <h2>Content 3</h2> </TabPanel> <TabPanel> <h2>Content 4</h2> </TabPanel> </Tabs> ); }; export default ExampleTabs;
上記の例では、TabListコンポーネントにdisabledTabClassName
プロパティとdisabledTabs
プロパティを指定しています。
disabledTabClassName
プロパティには、クラス名の配列 ['myDisabledClass1', 'myDisabledClass2']
を指定しています。これにより、無効化されたタブに対して複数のクラス名を適用することができます。
disabledTabs
プロパティには、オブジェクト { 'tab2': true, 'tab4': true }
を指定しています。このオブジェクトは、無効化するタブのキーとしてタブのインデックスや識別子を指定し、対応する値をtrue
に設定することでタブを無効化します。
ですが、ほとんどは文字列です。
これらの例を参考に、disabledTabClassName
プロパティを使用して無効化されたタブに対してカスタムのスタイリングを適用することができます。
activeTabClassName
タブがアクティブ状態時のみ付けられるカスタムクラス名となります。
import { Tab, TabList, TabPanel, Tabs } from 'react-tabs'; import 'react-tabs/style/react-tabs.css'; const ExampleTabs = () => { return ( <Tabs> <TabList activeTabClassName="myActiveClass"> <Tab>Tab 1</Tab> <Tab>Tab 2</Tab> <Tab>Tab 3</Tab> </TabList> <TabPanel> <h2>Content 1</h2> </TabPanel> <TabPanel> <h2>Content 2</h2> </TabPanel> <TabPanel> <h2>Content 3</h2> </TabPanel> </Tabs> ); }; export default ExampleTabs;
上記の例では、TabListコンポーネントにactiveTabClassName
プロパティを設定しています。このプロパティには、アクティブなタブに適用するためのクラス名を指定します。
TabList内に表示される各Tabは、タブのタイトルを表しています。
activeTabClassName
プロパティを指定することで、アクティブなタブに指定したクラス名が適用されます。これにより、アクティブなタブを視覚的に強調表示するためのスタイリングを適用することができます。
activeTabClassName
プロパティを使用してアクティブなタブに対してカスタムのスタイリングを適用することが可能となります。
className
基本的には4つのコンポーネントにはclassNameを付与する事が可能となっています。
import { Tab, TabList, TabPanel, Tabs } from 'react-tabs'; import 'react-tabs/style/react-tabs.css'; const ExampleTabs = () => { return ( <TabList className="TabList"> <Tabs className="Tabs"> <Tab className="Tab">1</Tab> </Tabs> <TabPanel className="TabPanel">One</TabPanel> </TabList> ); }; export default ExampleTabs;
上記の例では、各コンポーネントに対してclassName
プロパティを設定しています。
これにより、各コンポーネントに指定したクラス名が適用されます。これらのクラス名を使用して、各コンポーネントのスタイリングや視覚的な変更を行うことができます。
そして、Tab
で囲んだコンポーネントをreact-router-domを使用しページ間で画面遷移などで上手く連携させたりします。
例えば、React Router-domとReact Tabsを使用してページ遷移を行う簡単な例を示します。
まず、必要なパッケージをインストールします。
npm install react-router-dom@next react-tabs // or yarn add react-router-dom@next
"next"
タグが付いたパッケージは、開発者が次のバージョンを試し、テストし、フィードバックを提供することを目的としています。これにより、新しい機能や変更点についてのフィードバックを集めることができます。
したがって、react-router-dom@next
をインストールすることで、React Routerの次のバージョンの機能を利用できるようになりますが、実際のプロジェクトで使用する際には、開発状況や安定性に注意を払う必要がありますので気をつけてください。
次に、App.jsファイルに、以下のコードを追加します。
import React from 'react'; import { BrowserRouter as Router, Routes, Route, Link } from 'react-router-dom'; import { Tab, TabList, TabPanel, Tabs } from 'react-tabs'; import 'react-tabs/style/react-tabs.css'; // ページコンポーネント const Home = () => <h1>ホームページ</h1>; const About = () => <h1>アバウトページ</h1>; const Contact = () => <h1>コンタクトページ</h1>; const App = () => { return ( <Router> <Tabs> <TabList> <Tab> <Link to="/">Home</Link> </Tab> <Tab> <Link to="/about">About</Link> </Tab> <Tab> <Link to="/contact">Contact</Link> </Tab> </TabList> <Routes> <Route path="/" element={<TabPanel><Home /></TabPanel>} /> <Route path="/about" element={<TabPanel><About /></TabPanel>} /> <Route path="/contact" element={<TabPanel><Contact /></TabPanel>} /> </Routes> </Tabs> </Router> ); }; export default App;
上記のコードでは、react-router-domのBrowserRouter
を使用してルーティングを設定しています。また、Routes
コンポーネントを使用してルートのマッチングを行っています。
各ルートにはelement
プロパティを使用し、対応するページコンポーネントを指定しています。
最後に、Appコンポーネントをエクスポートしてアプリケーションを起動します。
これにより、React Router v6とReact Tabsを使用して、ページ遷移とタブの表示を行うことができます。
このコードはテンプレートとして提供したので、自由に構築やカスタマイズが可能です。
このテンプレートをベースにして、自分のアプリケーションの要件に合わせてルート、ページコンポーネント、タブなどを追加、変更、カスタマイズすることができます。
例えば、新しいルートやページコンポーネントを追加するには、<Routes>
内に新しい<Route>
要素を追加し、path
プロパティとelement
プロパティを指定します。
また、新しいタブを追加するには、<TabList>
内に新しい<Tab>
要素を追加し、その内部に<Link>
を配置します。
React Router v6の基本的な解説以下で学べますので、参照ください。
最後に
Reactタブには、操作できる2つの異なるモードがあり、状態を自分で管理する必要がある方法を変更します。
それは制御モードと非制御モードとなります。
非制御モードでは、react-tabsのデフォルトのモードであり、react-tabsコンポーネントにその状態を内部で処理させます。
defaultIndexで開始タブを変更でき、onSelectで変更可能です。
非制御モードでは、実行時にタブを強制的に変更することはできませんので注意して下さい。
制御モードは、TabsコンポーネントにselectedIndexを与えて有効にする必要があります。
このモードでは、react-tabsはタブの選択状態を内部で一切処理する事はありません。
すべての状態管理を外部アプリケーションに委ねます。
またonSelectにハンドラを設定することが強制され、defaultIndexは何の効果もないため、エラーをスローします。
制御モードを扱う際は、react-tabsの内部動作により、ラップしているコンポーネントに受信したPropsを渡す必要があります。
それを行う最も簡単な方法は、スプレッド演算子を使用することです。
本日は以上となります。
最後まで読んで頂きありがとうございます。
この記事が役に立ったら、ブックマークと共有をしていただけると幸いです。