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

Next.js 13中Suspense fallback加载状态不显示问题求助

Next.js 13中Suspense fallback不显示的解决方法

你的问题出在Next.js 13 App Router下对Suspense和异步组件的处理逻辑和传统React不同,以下是针对性的修复方案:

核心原因

Next.js 13 App Router默认使用服务器组件,React.lazy仅适用于客户端组件,且异步服务器组件不需要通过React.lazy引入,直接配合Suspense即可触发fallback。你之前的代码混用了两种加载方式,导致Suspense未正常工作。

修复方案(服务器组件场景推荐)

修改page.js

移除React.lazy,直接导入Trending组件:

import { Suspense } from "react";
import Loading from "./loading";
import Trending from "./Trending";

export default function Page() {
  return (
    <div>
      <Suspense fallback={<Loading />}>
        <Trending />
      </Suspense>
    </div>
  );
}

Trending组件保持不变

你的Trending是异步服务器组件,Next.js会自动识别并在数据加载/延迟期间触发Suspense的fallback:

import axios from "axios";

export default async function Trending() {
  const res = await axios.get(
    `https://api.themoviedb.org/3/trending/movie/day?api_key=1428e09fe38be9df57355a8d6198d916`
  );

  const data = res.data;

  await new Promise((resolve) => setTimeout(resolve, 3000));

  return (
    <div>
      <li>{data.results[0].title}</li>
    </div>
  );
}

客户端组件场景(需交互时使用)

如果Trending需要作为客户端组件(比如包含交互逻辑),需做以下调整:

修改Trending组件

添加'use client'指令,将异步数据请求移至useEffect(客户端组件不能直接是异步函数):

'use client';
import axios from "axios";
import { useState, useEffect } from "react";

export default function Trending() {
  const [data, setData] = useState(null);

  useEffect(() => {
    const fetchData = async () => {
      const res = await axios.get(
        `https://api.themoviedb.org/3/trending/movie/day?api_key=1428e09fe38be9df57355a8d6198d916`
      );
      await new Promise((resolve) => setTimeout(resolve, 3000));
      setData(res.data);
    };
    fetchData();
  }, []);

  if (!data) return null;

  return (
    <div>
      <li>{data.results[0].title}</li>
    </div>
  );
}

修改page.js

保留React.lazy,确保客户端组件的懒加载触发Suspense:

import { Suspense } from "react";
import Loading from "./loading";
const Trending = React.lazy(() => import("./Trending"));

export default function Page() {
  return (
    <div>
      <Suspense fallback={<Loading />}>
        <Trending />
      </Suspense>
    </div>
  );
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 12:42:17