Gatsby Header组件迁移NextJS的navigate替代及Material-UI makeStyles报错求助
- NextJS中通过
useRouterHook实现编程式导航,可直接替代Gatsby的navigate方法:- 导入对应Hook:如果使用Pages Router(NextJS 12及更早版本默认,或13+可选),导入
import { useRouter } from 'next/router';如果使用App Router(NextJS 13+默认),导入import { useRouter } from 'next/navigation' - 在组件内部初始化实例:
const router = useRouter() - 原代码中
navigate(目标路径)的写法替换为router.push(目标路径)即可
- 导入对应Hook:如果使用Pages Router(NextJS 12及更早版本默认,或13+可选),导入
问题2:makeStyles相关报错修复
结合你给出的代码,按以下顺序修改即可解决报错:
- 清理无效导入
你的代码同时保留了Gatsby的Link导入和NextJS的Link导入,存在命名冲突,且已经不需要Gatsby的相关依赖,直接删除import { Link, navigate } from 'gatsby'这一行。 - 添加客户端组件标识
Material UI v4的makeStyles属于纯客户端API,如果你使用的是NextJS 13及以上版本的App Router,需要在组件代码的最顶部添加'use client'指令,标记组件为客户端组件,避免服务端渲染时找不到浏览器上下文报错。 - 修复主题配置缺失
你的样式代码中使用了theme.palette.common.offBlack,MUI默认主题的common字段下仅内置black和white两个值,如果你没有在自定义MUI主题中定义offBlack,就会出现取值错误,要么在自定义主题中补充该色值定义,要么直接替换为实际使用的色值即可。 - 处理服务端渲染window不存在问题
你的activeIndex函数中直接调用了window.location.pathname,NextJS服务端渲染阶段不存在window对象,组件初始化时会触发报错,直接用上面初始化的router实例的pathname属性替换即可:把window.location.pathname改为router.pathname。 - 适配NextJS Link组件属性
NextJS的Link组件使用href属性定义跳转路径,而非Gatsby的to属性,你代码中所有绑定component={Link}的组件(Tab、Button、ListItem、IconButton等)的to属性都要改成href,避免跳转逻辑失效。
内容的提问来源于stack exchange,提问作者ThisIsShayan
相关产品推荐
相关产品推荐

