React + React Router v6 + use-react-router-breadcrumbs でパンくずリストを作ってみた

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