Next.js 13服务器和客户端组件混淆

ghg1uchk  于 2023-04-06  发布在  其他
关注(0)|答案(1)|浏览(271)

我有服务器组件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.文档说我不能在客户端组件中导入服务器组件,但很明显,我可以。我非常困惑。*
vshtjzan

vshtjzan1#

根据我的理解,只有当Server Components包含任何服务器专用代码(例如,数据库调用或使用组件级async/await)时,我们才能在Client Components中导入Server Components
在您的例子中,InitView没有任何特定于服务器的代码,因此在客户端组件中导入它可能会将其推断为Client Component
你可以在Next.js的beta文档中找到它-链接

相关问题