我正在尝试为Next.js项目设置Storybook。我有一个用于呈现Next.js的Link
标签的组件。我的问题是,当我加载此组件时,Storybook会引发以下错误:
Cannot read property 'pageLoader' of null
at Link.handleRef
要使Storybook与Next.js路由一起使用,特别是呈现Link
标签,该怎么做?
更新:导致错误的代码:
// button-component.js
import Link from 'next/link.js';
import t from 'prop-types';
import React from 'react';
function Button({ as, children, href, ...props }) {
const isExternal = href && href.startsWith('http');
const a = (
<a href={href} {...props}>
{children}
</a>
);
if (href) {
return isExternal ? (
a
) : (
<Link href={href} as={as}>
{a}
</Link>
);
}
return (
<button type="button" {...props}>
{children}
</button>
);
}
Button.propTypes = {
as: t.string,
children: t.node,
href: t.string,
};
export default React.memo(Button);
// button.stories.js
import React from 'react';
import Button from './button-component';
export default {
title: 'Button',
};
export const standardButton = () => <Button>Standard Button</Button>;
export const internalLink = () => <Button href='/buy'>
Internal Link
</Button>;
export const externalLink = () => (
<Button target="_blank" href="https://www.hopin.to">
External Link
</Button>
);
答案 0 :(得分:3)
我在Next.js的github上发现了有关此问题的报告:https://github.com/zeit/next.js/issues/9951
它是在5天前报告的,因此您可能遇到同样的问题。解决方案是升级到nextjs v9.1.8-canary.6
。阅读有关此内容的更多信息并查看源代码,这可能是您的问题。另外,如果您想尝试新的东西,还有更多的nextjs金丝雀版本。
如果这不能解决问题,那么我的另一个猜测是,您在Next.js页面外部使用Link
时遇到了错误。 Next.js可能在后台包含页面的依赖项。 Link
可能依赖于这些依赖关系,并且在找不到它们时抛出错误。如果要在Next.js页面之外测试组件,则可以创建一个自定义Link
组件,以测试您是否在Next.js中,如果存在则仅呈现Link
。例如:
import Link from 'next/link'
import Router from 'next/router'
const CustomLink = ({children, ...otherProps}) => {
const isPage = () => {
// if we're in a next.js route, then Router.router will be set
return Boolean(Router.router)
}
return isPage()
? (<Link {...otherProps}>{children}</Link>)
: children
}
然后使用CustomLink
代替Link
。