Создайте события маршрута RouteChangeStart и RouteChangeComplete в следующем клиентском компоненте js 14

У меня есть следующий проект 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.org/docs/app/api-reference/functions/… github.com/vercel/next.js/discussions/42016 github.com/vercel/next.js /обсуждения/…

cmgchess 22.04.2024 11:50
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
1
1 438
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Во-первых, в маршрутизаторе приложения NextJs вы должны использовать маршрутизатор из каталога next/navigation, а не next/router, который предназначен для pages. Тем не менее, события маршрутизатора больше не поддерживаются в маршрутизаторе app, но вы наверняка можете реализовать ход загрузки для маршрутизатора приложений, используя библиотеку NProgress, которую я также реализовал сам с некоторыми ссылками. Я пытался найти ссылку, но не смог, но вы все равно можете посмотреть мой код здесь.

Немного объяснений:

  • В реализации мы создаем обертку для хука useRouter и компонента Link для поддержки процесса загрузки. Теперь вместо импорта из next/navigation вы используете эту оболочку.
  • Вместо установки пакета nprogress я скопировал его содержимое и использовал оттуда.
  • Обязательно скопируйте все файлы внутри папки 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;

Другие вопросы по теме