У меня есть следующий проект js v14.0.4. Я пытаюсь применить индикатор выполнения верхней загрузки с пакетом NProgress для каждого изменения маршрута, которое происходит с помощью Link или router.push(). Но функции handleRouteChangeStart и handleRouteChangeComplete никогда не срабатывают. Я думаю, что проблема связана с Router.events.on('routeChangeStart', handleRouteChangeStart) и Router.events.on('routeChangeComplete', handleRouteChangeComplete), но я не знаю, как их заменить.
'use client';
import React, { useEffect } from 'react';
import { Router } from 'next/router';
import NProgress from 'nprogress'; // Import NProgress
import 'nprogress/nprogress.css'; // Import NProgress styles
import { usePathname } from 'next/navigation';
const TopLoader: React.FC = () => {
const pathname = usePathname();
useEffect(() => {
const handleRouteChangeStart = (url: string) => {
console.info(`Route change started: ${url}`);
// Execute custom logic here on route change start
NProgress.start();
};
const handleRouteChangeComplete = (url: string) => {
console.info(`Route change completed: ${url}`);
NProgress.done();
// Execute custom logic here on route change complete
};
// Listen to route change start
Router.events.on('routeChangeStart', handleRouteChangeStart);
// Listen to route change complete
Router.events.on('routeChangeComplete', handleRouteChangeComplete);
return () => {
// Clean up event listeners when the component unmounts
Router.events.off('routeChangeStart', handleRouteChangeStart);
Router.events.off('routeChangeComplete', handleRouteChangeComplete);
};
}, [pathname]); // Only re-run effect if pathname changes
useEffect(() => {
// Clean up NProgress on component unmount
return () => {
NProgress.remove();
};
}, []);
return null;
};
export default TopLoader;
Во-первых, в маршрутизаторе приложения NextJs вы должны использовать маршрутизатор из каталога next/navigation
, а не next/router
, который предназначен для pages
. Тем не менее, события маршрутизатора больше не поддерживаются в маршрутизаторе app
, но вы наверняка можете реализовать ход загрузки для маршрутизатора приложений, используя библиотеку NProgress, которую я также реализовал сам с некоторыми ссылками. Я пытался найти ссылку, но не смог, но вы все равно можете посмотреть мой код здесь.
Немного объяснений:
useRouter
и компонента Link
для поддержки процесса загрузки. Теперь вместо импорта из next/navigation
вы используете эту оболочку.custom-router
, чтобы она работала, а также обязательно добавьте файл HandleOnComplete
внутри route-change-complete.tsx
в корневой макет.Оставьте комментарий для последующих вопросов или проблем.
этот код работает для меня
"use client"
import React, {useEffect} from 'react';
import {usePathname, useSearchParams} from "next/navigation";
import NProgress from "nprogress";
import 'nprogress/nprogress.css'; // Import NProgress styles
const Loader = () => {
let pathname = usePathname()
let searchParams = useSearchParams()
useEffect(() => {
const handleStart = () => NProgress.start()
const handleStop = () => NProgress.done()
handleStop()
return () => {
handleStart()
}
}, [pathname, searchParams])
return <></>;
};
export default Loader;
и в моих основных компонентах
import React, {ReactNode} from 'react';
import Loader from "@/Components/Layouts/Loader";
interface Props {
children: ReactNode
}
const MainLayout = (props: Props) => {
return (
<>
<Loader/>
<main>
{props.children}
</main>
</>
);
};
export default MainLayout;
вы используете маршрутизатор приложений nextjs.org/docs/app/api-reference/functions/… github.com/vercel/next.js/discussions/42016 github.com/vercel/next.js /обсуждения/…