我有一个名为CampaignTable的客户端组件。CampaignTable组件需要一个columns对象来呈现列。在我的columns对象中,我导入了一个名为CampaignActions的服务器组件。这是一个简单的下拉菜单,我在其中调用了一个API来获取一些数据,并在弹出框中使用这些数据。
然而,由于在CampaignActions组件中执行的API调用,我的页面变得非常慢,我得到一个错误:
- 错误:服务器函数无法在初始呈现期间调用。这将创建一个fetch瀑布。尝试使用服务器组件将数据传递给客户端组件。*
然而,据我所知,该组件已经是一个React服务器组件。我可以通过删除async并在顶层页面中执行API调用并将数据作为props向下传递来解决这个问题,例如:
页面> CampaignTable > CampaignActions。
但我想知道为什么我的方法是错误的/引起问题。因为如果我能在需要它的组件中执行API调用,而不是将它传递下去,那就太好了。
这是我的代码
'use client'
import React from "react";
const CampaignTable = (props: CampaignTableProps) => {
const campaignColumns = useMemo(() => (
[
columnHelper.accessor("id", {
header: () => "ID",
cell: info => info.getValue()
}),
columnHelper.display({
id: "socials",
header: () => "Actions",
cell: ({row}) => {
return (
<CampaignActions {...row.original}/>
)
}
}),
]
), [])
return (
<DataTable
data={props.campaigns || []}
columns={campaignColumns}
/>
)}
字符串
我的CampaignActions代码
async function CampaignActions(props: Campaign){
const {data: clients} = await getAllClients().then((res) => res);
return (
<DataTableActions
edit={{
onEdit: async () => {
await openUpdateCampaignModal({
...props,
clients: clients ?? [],
})
}
}}
/>
)}
型
1条答案
按热度按时间ghhkc1vu1#
您面临的问题是由于React服务器组件(RSC)的工作方式。它们的设计目的不是为了在初始渲染期间获取数据,以避免“获取瀑布”场景,这可能会减慢应用的渲染速度。
在您的示例中,CampaignActions试图在初始呈现期间获取数据,因此出现错误。即使它是一个服务器组件,在这个阶段仍然不允许它获取数据。
解决这个问题的一个好方法是在组件树的更高位置获取数据,并将其作为props向下传递。通过这种方式,数据被提取一次,并且可以由多个组件使用,从而提高性能。或者,考虑使用Redux或MobX等状态管理库来管理应用的状态。
您的方法不一定是错误的,但由于RSC的限制,它会导致问题。在需要数据的组件中获取数据可能看起来很方便,但它可能会导致性能问题和更复杂的状态管理。因此,通常最好在更高级别上获取数据并将其作为props传递下去。希望这对你有帮助!