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

Next.js 13中如何使用next/navigation实现返回上一页?

修复Next.js中使用useRouter返回上一页的Hydration Error问题

方案1:改用浏览器原生API

直接用浏览器自带的history.back()实现返回逻辑,无需依赖Next.js的useRouter,从根源避免服务端渲染冲突:

'use client';

export default function SupplierList() {
  return (
    <>
      <div>
        <button onClick={() => window.history.back()}>Back</button>
      </div>
    </>
  );
}

方案2:动态导入组件并禁用SSR

如果一定要用Next.js的useRouter,可以通过动态导入组件并关闭服务端渲染,确保组件只在客户端执行:

第一步:拆分返回按钮组件(比如命名为BackButton.js)

'use client';
import { useRouter } from 'next/navigation';

export default function BackButton() {
  const router = useRouter();
  return (
    <button onClick={() => router.back()}>Back</button>
  );
}

第二步:在父组件中动态导入

import dynamic from 'next/dynamic';

// 禁用SSR,组件仅在客户端渲染
const BackButton = dynamic(() => import('./BackButton'), { ssr: false });

export default function SupplierList() {
  return (
    <>
      <div>
        <BackButton />
      </div>
    </>
  );
}

方案3:用useEffect确保客户端环境

通过状态标记组件已在客户端挂载,避免服务端与客户端渲染的HTML不匹配:

'use client';
import { useRouter } from 'next/navigation';
import { useState, useEffect } from 'react';

export default function SupplierList() {
  const router = useRouter();
  const [isClient, setIsClient] = useState(false);

  useEffect(() => {
    // 组件挂载后标记为客户端环境
    setIsClient(true);
  }, []);

  return (
    <>
      {/* 仅在客户端渲染按钮 */}
      {isClient && (
        <div>
          <button onClick={() => router.back()}>Back</button>
        </div>
      )}
    </>
  );
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 13:12:57