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

Next.js 13中如何在路由导航间创建加载组件

在Next.js 13里给路由导航加加载组件的正确姿势

为啥之前用next/router不行?因为Next.js 13的App Router彻底换了路由API,客户端组件得用next/navigation里的工具,旧的next/router已经不兼容了。下面给你两种靠谱的实现方式:

方式一:全局监听路由变化(适合全局加载提示)

先写个客户端组件,用useRouter监听路由的开始、完成/错误事件,控制加载组件的显示:

'use client';

import { useState, useEffect } from 'react';
import { useRouter } from 'next/navigation';
import LoadingSpinner from './LoadingSpinner'; // 替换成你自己的加载组件

export default function NavLoader() {
  const [isNavigating, setIsNavigating] = useState(false);
  const router = useRouter();

  useEffect(() => {
    // 路由开始跳转时显示加载
    const startNav = () => setIsNavigating(true);
    // 跳转完成或出错时隐藏加载
    const endNav = () => setIsNavigating(false);

    router.events.on('routeChangeStart', startNav);
    router.events.on('routeChangeComplete', endNav);
    router.events.on('routeChangeError', endNav);

    // 组件卸载时移除监听
    return () => {
      router.events.off('routeChangeStart', startNav);
      router.events.off('routeChangeComplete', endNav);
      router.events.off('routeChangeError', endNav);
    };
  }, [router]);

  return isNavigating ? <LoadingSpinner /> : null;
}

然后把这个组件放到根布局app/layout.js里,这样所有路由跳转都会触发加载提示:

import NavLoader from './components/NavLoader';

export default function RootLayout({ children }) {
  return (
    <html lang="zh-CN">
      <body>
        <NavLoader />
        {children}
      </body>
    </html>
  );
}

方式二:页面级内置加载(适合单页面加载)

如果只是某个页面需要加载提示,Next.js 13 App Router自带了更简单的方案——在对应页面的文件夹下创建loading.js文件。

比如你要给/posts页面加加载,就在app/posts文件夹里新建loading.js:

export default function PostsLoading() {
  return <div>正在加载帖子...</div>;
}

当用户导航到/posts时,会自动显示这个加载组件,直到页面的数据获取完成,完全不用手动监听路由,省心得很。

注意点

  • 用useRouter的组件必须是客户端组件,记得开头加'use client';指令。
  • 全局监听适合全站统一的加载提示,页面级loading.js适合单独页面的个性化加载状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 08:40:06