next.js React服务器组件错误:在初始呈现期间无法调用服务器函数

6rvt4ljy  于 2023-08-04  发布在  React
关注(0)|答案(1)|浏览(121)

我有一个名为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 ?? [],
                })
            }
        }}
    />
)}

ghhkc1vu

ghhkc1vu1#

您面临的问题是由于React服务器组件(RSC)的工作方式。它们的设计目的不是为了在初始渲染期间获取数据,以避免“获取瀑布”场景,这可能会减慢应用的渲染速度。
在您的示例中,CampaignActions试图在初始呈现期间获取数据,因此出现错误。即使它是一个服务器组件,在这个阶段仍然不允许它获取数据。
解决这个问题的一个好方法是在组件树的更高位置获取数据,并将其作为props向下传递。通过这种方式,数据被提取一次,并且可以由多个组件使用,从而提高性能。或者,考虑使用Redux或MobX等状态管理库来管理应用的状态。
您的方法不一定是错误的,但由于RSC的限制,它会导致问题。在需要数据的组件中获取数据可能看起来很方便,但它可能会导致性能问题和更复杂的状态管理。因此,通常最好在更高级别上获取数据并将其作为props传递下去。希望这对你有帮助!

相关问题