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

如何手动触发NextJS-TopLoader组件的加载动画?

如何手动触发NextJS-TopLoader组件的加载动画?

我之前也碰到过一模一样的问题——用<Link>组件跳转时加载条正常触发,但用router.push()这种编程式路由跳转就没反应,查了半天文档才搞明白原因:NextJS-TopLoader默认只监听了<Link>的声明式跳转事件,编程式跳转不会自动触发加载逻辑,得咱们手动调用它的控制方法才行。

结合你的代码,给你两种实用的解决方案:

方案一:在跳转场景手动调用加载条API

NextJS-TopLoader是基于nprogress封装的,它暴露了start()(启动加载)和complete()(结束加载)这两个核心方法,直接在你的登录成功逻辑里调用就行:

try {
    // ... 省略API调用、登录成功判断的代码
    toast.success('Login successful!');
    
    // 手动启动顶部加载条
    NextTopLoader.start();
    // 执行路由跳转,等跳转完成后结束加载条
    await router.push('/dashboard');
    NextTopLoader.complete();
} catch (error) {
    // ... 错误处理代码
}

这样就能和<Link>跳转的加载条效果完全一致,精准控制加载的启动和结束时机。

方案二:全局监听路由事件(一劳永逸)

如果希望所有编程式跳转都自动触发加载条,不用每次都手动写代码,可以在_app.tsx里监听Next.js Router的全局事件,不管是<Link>还是router.push()都能自动触发加载条:

import { useRouter } from 'next/router';
import NextTopLoader from 'nextjs-toploader';
import { useEffect } from 'react';

export default function App({ Component, pageProps }) {
  const router = useRouter();

  useEffect(() => {
    // 路由开始跳转时启动加载条
    const startLoader = () => NextTopLoader.start();
    // 路由跳转完成/失败时结束加载条
    const stopLoader = () => NextTopLoader.complete();

    // 绑定路由事件监听
    router.events.on('routeChangeStart', startLoader);
    router.events.on('routeChangeComplete', stopLoader);
    router.events.on('routeChangeError', stopLoader);

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

  return (
    <>
      <NextTopLoader />
      <Component {...pageProps} />
    </>
  );
}

另外提一句,你之前试的NextTopLoader.caller()是个无效方法,NextJS-TopLoader的有效手动控制方法就是start()、complete()这些和nprogress对齐的API~

备注:内容来源于stack exchange,提问作者Primeboss

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 09:35:29