我有服务器组件InitView;
const InitView = () => {
useEffect(() => { });
return (
<>
<Hero/>
<span className="text-xl font-normal text-gray-100">Now, how do you want to play?</span>
<GameModeMenu/>
</>
);
}
export default InitView;
另外我还有一个服务器组件View;
interface ViewProps {
children?: React.ReactNode;
}
const View = ({children}:ViewProps) => {
return (
<main className="home w-screen h-screen flex flex-col gap-10 justify-start items-center bg-neutral-900 px-8 py-10">
{children}
</main>
);
}
export default View;
这是我的页面.tsx
export default function Page() {
return (
<View>
<InitView/>
</View>
)
}
当我尝试用 pass-child 方法 * 导入View组件内的InitView时,抛出错误;
你正在导入一个需要useEffect的组件。它只在客户端组件中工作,但它的父组件都没有标记为“使用客户端”,因此默认情况下它们是服务器组件。
我完全可以接受这个错误,因为我试图在服务器组件中使用效果。
Page.tsx
export default function Page() {
return (
<View/>
)
}
View.tsx
"use client";
const View = () => {
return (
<main className="home w-screen h-screen flex flex-col gap-10 justify-start items-center bg-neutral-900 px-8 py-10">
<InitView/>
</main>
);
}
export default View;
错误现在已经消失了。为了澄清;
我可以在InitView组件中使用效果,而不需要任何“使用客户端”标记,因为我直接将其导入到View(标记为客户端)组件中。
我假设客户端组件中的每个直接导入的(服务器或客户端)组件都将是客户端组件,就像前面的错误所说的那样 * 其父组件都没有标记“使用客户端”,所以默认情况下它们是服务器组件。*
你们有什么想法吗?我说的对还是错?
- P.S.文档说我不能在客户端组件中导入服务器组件,但很明显,我可以。我非常困惑。*
1条答案
按热度按时间vshtjzan1#
根据我的理解,只有当
Server Components
包含任何服务器专用代码(例如,数据库调用或使用组件级async/await)时,我们才能在Client Components
中导入Server Components
。在您的例子中,
InitView
没有任何特定于服务器的代码,因此在客户端组件中导入它可能会将其推断为Client Component
。你可以在Next.js的beta文档中找到它-链接