React + MUI の Breadcrumbs
では、 React Router と統合して扱えます。
Integration with react-router | React Breadcrumbs component - MUI
ただ、サンプルコードは React Router v5用のもののようで、 codesandbox で公開されているデモがエラーで止まっています。
React Router v6 向けにさくっと作れるものがないかを探したところ、 icd2k3/use-react-router-breadcrumbs
がありました。
https://github.com/icd2k3/use-react-router-breadcrumbs
そこで、さくっと作れるパンくずリストはどんなものだろうと思い、試してみた時のメモを残します。
目次
環境
- React 17.0.2
- React Router 6.0.1
- use-react-router-breadcrumbs 3.0.1
実装
ルーティング
今回は、 /router-breadcrumbs/1st/2nd/3rd
のようなネストしたルーティングでパンくずリストを表示してみます。
そのため、ルーティングはこんな感じにします。
<Routes> <Route path="router-breadcrumbs"> <Route path="1st"> <Route path="" element={<FirstLayer />} /> <Route path="2nd"> <Route path="" element={<SecondLayer />} /> <Route path="3rd"> <Route path="" element={<ThirdLayer />} /> </Route> </Route> </Route> </Route> </Routes>
パンくずリストのコンポーネントを作成
use-react-router-breadcrumbs
のREADMEに従い、パンくずリストのコンポーネントを作成します。
import useBreadcrumbs from 'use-react-router-breadcrumbs' import {NavLink} from 'react-router-dom' const Component = (): JSX.Element => { const breadcrumbs = useBreadcrumbs() return ( <> {breadcrumbs.map(({match, breadcrumb}, index) => ( <span key={match.pathname}> {index > 0 && <> / </>} <NavLink to={match.pathname}> {breadcrumb}</NavLink> </span> ))} </> ) } export default Component
各ページのコンポーネントを作成
パンくずリストのコンポーネントを組み込んだページコンポーネントを用意します。
FirstLayer.tsx
import {Link} from 'react-router-dom' import MyBread from '@/components/pages/router_breadcrumbs/MyBread' const Component = (): JSX.Element => { return ( <> <MyBread /> <h1>First Layer</h1> <Link to="/router-breadcrumbs/1st/2nd">To 2nd Layer</Link> </> ) } export default Component
SecondLayer.tsx
import {Link} from 'react-router-dom' import MyBread from '@/components/pages/router_breadcrumbs/MyBread' const Component = (): JSX.Element => { return ( <> <MyBread /> <h1>Second Layer</h1> <Link to="/router-breadcrumbs/1st/2nd/3rd">To 3rd Layer</Link> </> ) } export default Component
ThridLayer.tsx
import MyBread from '@/components/pages/router_breadcrumbs/MyBread' const Component = (): JSX.Element => { return ( <> <MyBread /> <h1>Third Layer</h1> </> ) } export default Component
動作確認
以下のようなパンくずリストができました。
1st Layer
2nd Layer
3rd Layer
実際には README の Advanced 以降のように調整する必要があるかもしれませんが、さくっと作る場合はこんな感じでできました。
ソースコード
Githubに上げました。
https://github.com/thinkAmi-sandbox/react_mui_with_vite-sample
今回のプルリクはこちらです。
https://github.com/thinkAmi-sandbox/react_mui_with_vite-sample/pull/3