You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React警告:Container组件children属性无效,async组件问题求助

问题分析与解决思路

问题根源

你编写的LatestSites是一个异步函数组件,执行后返回的是Promise<JSX.Element>,而MUI的Container组件要求children必须是合法的ReactNode(如React元素、字符串、null等)。Promise不属于React可直接渲染的节点类型,因此触发了Invalid prop 'children'的警告。


解决方法

方案1:Next.js App Router 服务器组件场景(你的代码适配此场景)

如果项目基于Next.js App Router,默认页面组件是服务器组件,可直接引入异步组件。若页面组件(page.tsx)被标记为客户端组件(添加了'use client'),则需用Suspense包裹异步组件以提供加载状态:

// page.tsx
'use client'; // 若页面为客户端组件
import { Container } from '@mui/material';
import { Suspense } from 'react';
import LatestSites from './_components/LatestSites';

export default function Home() {
  return (
    <Container sx={{ pt: 2 }}>
      <Suspense fallback={<div>加载中...</div>}>
        <LatestSites />
      </Suspense>
    </Container>
  );
}

方案2:客户端组件异步请求处理

如果需要在客户端组件中完成数据获取,不要将组件定义为异步函数,改用useEffect + useState处理异步逻辑:

// LatestSites.tsx
import { useState, useEffect } from 'react';
import prisma from '@/prisma/client';

const LatestSites = () => {
  const [sites, setSites] = useState([]);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    const fetchSites = async () => {
      const siteData = await prisma.site.findMany({
        orderBy: { startDate: 'desc' },
        take: 5,
        include: { assignedToUser: true },
      });
      setSites(siteData);
      setLoading(false);
    };

    fetchSites();
  }, []);

  if (loading) return <div>加载中...</div>;

  return <div>test</div>;
};

export default LatestSites;

内容的提问来源于stack exchange,提问作者RawAnimal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 15:27:11