Как обнаружить изменение хэша URL-адреса в Next.js?

#reactjs #url #next.js #nextjs-dynamic-routing

Вопрос:

Как мы обнаруживаем изменение хэша URL-адреса Next.js проект?

Я не хочу перезагружать свою страницу каждый раз, когда пуля меняется.
Я не могу использовать, так как все мои данные поступают из БД
Пример: При нажатии на тег из
http://example/test#url1
Для
http://example.com/test#url2

Попробовал ниже, но это, похоже, работает только для изменения пути.

 import React, { useEffect,useState } from 'react';
import { useRouter } from 'next/router'

const test = () => {
    const router = useRouter();

    useEffect(() => {
        console.log(router.asPath);
    }, [router.asPath]);

    return (<></>);
};

export default test;
 

Ответ №1:

Вы можете прослушивать изменения хэша с помощью hashChangeStart события from router.events .

 const Test = () => {
    const router = useRouter();

    useEffect(() => {
        const onHashChangeStart = (url) => {
            console.log(`Path changing to ${url}`);
        };

        router.events.on("hashChangeStart", onHashChangeStart);

        return () => {
            router.events.off("hashChangeStart", onHashChangeStart);
        };
    }, [router.events]);

    return (
        <>
            <Link href="/#some-hash">
                <a>Link to #some-hash</a>
            </Link>
            <Link href="/#some-other-hash">
                <a>Link to #some-other-hash</a>
            </Link>
        </>
    );
};
 

Если вы не используете next/link или next/router не используете навигацию на стороне клиента (не рекомендуется в Next.js приложения), то вам нужно будет прослушать window hashchange событие.

Ваш useEffect будет выглядеть следующим образом.

 useEffect(() => {
    const onHashChanged = () => {
        console.log('Hash changed');
    };

    window.addEventListener("hashchange", onHashChanged);

    return () => {
        window.removeEventListener("hashchange", onHashChanged);
    };
}, []);
 

Комментарии:

1. Спасибо @juliomalves, я не могу использовать <Ссылку>, так как весь мой html-код взят из базы данных

2. Я обновлю вопрос

3. Без <Ссылка> события не запускаются в моем приложении

4. Если вы хотите, чтобы события были подхвачены к next/router тому времени, вам нужно использовать next/link или next/router для навигации на стороне клиента. В противном случае вам нужно будет добавить прослушиватель событий для window hashchange события. Я обновлю свой ответ.