utk*_*hin 7 reactjs next.js react-server-components next.js13
我有一个服务器组件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;
Run Code Online (Sandbox Code Playgroud)
我还有一个服务器组件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;
Run Code Online (Sandbox Code Playgroud)
这是我的page.tsx
export default function Page() {
return (
<View>
<InitView/>
</View>
)
}
Run Code Online (Sandbox Code Playgroud)
当我尝试使用pass-child方法将InitView导入View组件时,它会抛出错误;
您正在导入需要 useEffect 的组件。它仅在客户端组件中工作,但其父组件都没有标记为“使用客户端”,因此默认情况下它们是服务器组件。
我完全同意这个错误,因为我正在尝试在服务器组件内使用效果。然而,如果我将代码更改为这样,事情就是这样;
页面.tsx
export default function Page() {
return (
<View/>
)
}
Run Code Online (Sandbox Code Playgroud)
查看.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;
Run Code Online (Sandbox Code Playgroud)
现在错误消失了。澄清;
我可以在 InitView 组件中使用效果,而无需任何“使用客户端”标记,因为我直接将其导入到View(标记为客户端)组件中。
我假设客户端组件中的每个直接导入的(服务器或客户端)组件都将是客户端组件,因为前面的错误表明其父组件都没有标记为“使用客户端”,因此默认情况下它们是服务器组件。
你们有什么想法吗?我是错还是对?
PS 文档说我无法将服务器组件导入客户端组件内,但可以清楚地看到,我可以。我很困惑。
这个问题已经有足够的解释了,但我会尝试澄清一些事情。
TL:DR:您需要该'use client'指令才能使用仅限客户端的功能。一旦组件成为客户端,它的嵌套组件也是客户端。无法更改或拦截此行为。
需要澄清的一些重要细节:
useEffect等等useRouter)。page.jsx=> PageMain.jsx=>SomeModal.jsx默认情况下,所有 3 个组件都是服务器端的。PageMain.jsx
(useEffect、useState、useRouter、页面转换、客户端库...),您需要将该组件标记为 client: 'use client'。现在PageMain.jsx将在客户端渲染。它的子项也将在客户端渲染。它的孙子也会这么做。你说对了)))'server-only'和'client-only'。这些不允许您再次制作仅服务器组件。这些只是为了产生错误。请参阅此处的文档Suspense文档dynamic中的示例)。但不要欺骗自己。这更像是具有“组件”响应类型的 get-request。该组件将被插入到您的客户端树中。这接近于“获取一些原始 html,然后使用 with 将其插入到组件树中dangerouslySetInnerHTML”的情况。当然,在这种情况下,您的服务器数据首先在服务器上呈现,因此可以使用数据库查询。它可以使用一些其他服务器组件,但同样,服务器上没有客户端功能。我有很多项目,但没有一个项目可以做到至少 50% 仅服务器化。我个人并不希望“仅服务器”组件能够神奇地解决任何优化问题或显着加速任何普通网站(如 Medium.com 或 Reddit)。
我希望我的深入解释和各种例子能够对某人有所帮助。
| 归档时间: |
|
| 查看次数: |
23658 次 |
| 最近记录: |