📕

【ReactRouter】NavLinkを持ったコンポーネントがStorybookで動かなかった

2023/10/03に公開

事象

React Router v6でNavLinkを持ったコンポーネントを、Storybook上で動かそうとしたら以下のエラーが発生した。

useLocation() may be used only in the context of a <Router> component.
Header.tsx
import { NavLink } from 'react-router-dom'

export const Header = () => {
  return (
    <header>
      <nav>
        <ul>
          <NavLink to="/">Home</NavLink>
          <NavLink to="/titles">Titles</NavLink>
          <NavLink to="/about">About</NavLink>
        </ul>
      </nav>
    </header>
  )
}

解決策

  • preview.tsxで起点となっている<Story />を、<BrowserRouetr>で囲む
.storybook/preview.tsx
const preview: Preview = {
  parameters: {
    actions: { argTypesRegex: '^on[A-Z].*' },
    controls: {
      matchers: {
        color: /(background|color)$/i,
        date: /Date$/,
      },
    },
  },
  decorators: [
    (Story) => (
      <>
        <BrowserRouter>
          <Story />
        </BrowserRouter>
      </>
    ),
  ],
}

アプリ側の<App /><BrowserRouetr>で囲って動いていたため、もしやと思い試してみたら解決しました。

Discussion