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

在Next.js项目中如何检测URL hash变化且不触发页面重载?

Next.js 检测URL hash变化的实现方案

原代码失效原因

你之前监听router.asPath的代码不生效,是因为Next.js路由系统默认仅在路径(pathname)、查询参数(query)变化时才会触发路由状态更新,hash变更属于纯浏览器端行为,不会触发useRouter的状态更新,因此不会触发副作用执行。

解决方案

直接监听浏览器原生hashchange事件即可,该方案不会触发页面重载,也不需要依赖<Link>组件,完全符合你的业务场景需求。

Pages Router 写法

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

const Test = () => {
    useEffect(() => {
        // hash变更处理逻辑
        const handleHashChange = () => {
            const currentHash = window.location.hash;
            console.log('当前hash为:', currentHash);
            // 此处编写你的业务逻辑,比如请求数据库拉取对应数据
        };

        // 组件挂载时先读取一次初始hash
        handleHashChange();

        // 注册hash变化监听
        window.addEventListener('hashchange', handleHashChange);

        // 组件卸载时移除监听,避免内存泄漏
        return () => {
            window.removeEventListener('hashchange', handleHashChange);
        };
    }, []);

    return <></>;
};

export default Test;

App Router(Next.js 13+)写法

'use client'; // 客户端组件必须添加该标识

import React, { useEffect } from 'react';

const Test = () => {
    useEffect(() => {
        const handleHashChange = () => {
            const currentHash = window.location.hash;
            console.log('当前hash为:', currentHash);
            // 此处编写你的业务逻辑
        };

        handleHashChange();
        window.addEventListener('hashchange', handleHashChange);
        return () => window.removeEventListener('hashchange', handleHashChange);
    }, []);

    return <></>;
};

export default Test;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 04:57:03