如何在 Storybook 中使用 NextJS 的“useRouter()”钩子

Bre*_*nan 6 next.js storybook

我一直在尝试在 Storybook 中使用 Next.js 中的 useRouter 钩子。但是,每次加载 Storybook 时,我都会收到“无法读取 null 的属性“路径名””。我该如何解决这个问题?

import { useRouter } from "next/router";

const NavStrip = () => {
  const router = useRouter();

  return (
    ...
            <Link href="/dashboard" passHref>
              <StyledLink active={router.pathname === "/dashboard"}>
                ...
              </StyledLink>
            </Link>
    ...
         )
}
Run Code Online (Sandbox Code Playgroud)

NavStrip.stories.tsx

import React from "react";
import NavStrip from "./index";

export default {
  component: NavStrip,
  title: "NavStrip",
};

export const Default = () => <NavStrip />;
Run Code Online (Sandbox Code Playgroud)

Ang*_*ias 7

您应该使用Storybook Addon Next Router。正如此答案所述,您需要Link在 Next 内运行并且 Storybook 不会加载 Next,因此此插件将为Router您模拟。

在我的配置中,我需要做的就是:

// .storybook/preview.js
import { withNextRouter } from 'storybook-addon-next-router';

export const decorators = [withNextRouter()]
Run Code Online (Sandbox Code Playgroud)

那应该解决它。


jam*_*mes 1

Storybook 组件在 Next 环境和支持page使用next/router. 因此,您将无法在下一页及其子页面之外使用它。

Next 的路由器功能是在 Context API提供程序中创建的,因此为了使用useRouter您的组件必须是该提供程序的子组件(在故事书的情况下永远不会)。

  • 我知道这篇文章已经很老了,但是我们应该如何模拟它呢? (2认同)