游乐游手机版
首页/前端开发/文章详情

在Next.js App Router中正确使用useRouter的导入方式

时间:2026-07-08 06:54
在Next jsAppRouter中,使用`next navigation`而非`next router`导入`useRouter`,组件顶部需声明` useclient `。错误导入会触发“NextRouterwasnotmounted”报错。AppRouter路由API与PagesRouter不同,需遵循规范。

先给结论:如果你在 Next.js App Router 项目中遭遇“NextRouter was not mounted”报错,绝大多数情况下是导入路径使用不当所致。正确的解决方式是使用 next/navigation 而非 next/router 来导入 useRouter,同时务必在组件顶部显式添加 'use client' 指令。虽然问题本身看似简单,但其背后反映了 App Router 与 Pages Router 在路由架构设计上的本质区别。

Next.js App Router 中 useRouter 的正确导入方式

Next.js 13+ 引入的 App Router 与传统的 Pages Router 在路由 API 层面完全是两套不同体系:next/router 基于旧版 Router 实例,仅适用于 Pages Router;而在 App Router 环境下,所有路由能力均由 next/navigation 统一提供,涵盖 useRouteruseSearchParamsredirectnotFound 等核心接口。

因此,你代码中报错的根本原因非常清晰:

  • ❌ 错误写法:import { useRouter } from 'next/router' —— 该写法在 App Router 中无效,导致路由无法正常挂载;
  • ✅ 正确写法:import { useRouter } from 'next/navigation' —— 这是 App Router 官方推荐的客户端路由 Hook 导入方式。

除此之外,还有几个关键要点值得特别留意:

✅ 正确用法示例(适配 App Router)

'use client';import { useRouter, useSearchParams } from 'next/navigation';import { useEffect, useState } from 'react';export default function NFTDetails() {  const router = useRouter();  const searchParams = useSearchParams(); // 推荐用于读取 query 参数  const [nft, setNft] = useState>({});  // 方案一:使用 useSearchParams(推荐,无需依赖路由就绪状态)  useEffect(() => {    const data = Object.fromEntries(searchParams.entries());    setNft(data);  }, [searchParams]);  // 方案二:若需监听路由变化或执行导航,可结合 useRouter.push()  // router.push('/nft-details?tokenId=123');  return (    

NFT Details

{JSON.stringify(nft, null, 2)}

);}

来源:https://www.php.cn/faq/2751858.html
上一篇CSS padding-bottom属性用法与计算规则实战要点 下一篇前端页面锚点滚动定位偏移问题的可靠解决方案
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
深入理解调用栈与异步任务的状态同步机制
前端开发 · 2026-07-08

深入理解调用栈与异步任务的状态同步机制

调用栈仅记录同步执行流,异步回调由事件循环调度、任务队列存放,闭包维持作用域。执行时新建上下文入栈,不复用旧栈帧。调用栈不主动同步异步状态,事件循环是真正的协调者。

HTML自定义元素实现跨组件通信的完整指南
前端开发 · 2026-07-08

HTML自定义元素实现跨组件通信的完整指南

自定义元素跨组件通信需依赖CustomEvent,且bubbles和composed必须同时设为true才能穿透ShadowDOM。事件监听应挂载在document或父容器等合适节点,避免使用DOM查找或data ARIA属性替代事件通信,从而确保事件正确穿越边界,保持跨组件通信的可靠性。

JavaScript static关键字在工具库构建中的应用
前端开发 · 2026-07-08

JavaScript static关键字在工具库构建中的应用

在JavaScript工具库构建中,static关键字将函数或常量挂载到类名上,无需实例化即可调用,适用于无状态操作如日期格式化、字符串截断、深克隆,并统一管理配置常量与实现工厂方法,但需避免依赖实例状态。

如何避免静态初始化块异常导致应用冷启动中断
前端开发 · 2026-07-08

如何避免静态初始化块异常导致应用冷启动中断

防范静态初始化失败导致应用中断,需用try-catch兜住异常并提供安全默认值;将高风险逻辑移出static块,改用延迟加载或Holder模式;显式控制初始化顺序并增强可观测性;诊断时直击ExceptionInInitializerError的根因。

虚拟DOM标签级diff比对优化过程详解
前端开发 · 2026-07-08

虚拟DOM标签级diff比对优化过程详解

虚拟DOMdiff以节点为单位,按层级同标签优先判断复用,通过key精准识别节点身份,配合细粒度属性更新及短路优化,避免全量递归比较,只更新变化的节点,跳过冗余计算,将时间复杂度从O(n³)降至接近O(n),从而大幅提升渲染性能。