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

Next.js刷新页面出现Prop `href` did not match. Server报错如何解决?

问题根因
  • 静态导出的Next.js页面在首次hydrate阶段,router.query和useLanguageQuery()返回的queryLanguage初始值为undefined,你代码中直接在渲染层判断、拼接参数,会导致hydration不匹配报错,这也是刷新时触发报错的核心原因
  • 下拉菜单内的所有内部跳转Link组件未携带lang查询参数,跳转后丢失语言参数,刷新时next-export-i18n无法读取到语言配置触发报错
  • 你当前Link的href属性中query字段拼接为字符串的写法不符合Next.js规范,容易引发解析错误
修复方案

1. 新增挂载状态避免hydration不匹配

在NavBar组件中新增isMounted状态,只有客户端完成挂载后再渲染依赖语言参数的内容,同时给language设置默认值:

import Link from "next/link"
import { useRouter} from "next/router"
import { useTranslation, useLanguageQuery, LanguageSwitcher } from 'next-export-i18n'
import { useEffect, useState } from 'react'

const NavBar = ({...props}) => {
    const router = useRouter()
    const { t } = useTranslation('navbar')
    var [queryLanguage] = useLanguageQuery()
    const [language, setLanguage] = useState('en') // 配置默认语言
    const [isMounted, setIsMounted] = useState(false) // 新增挂载标记

    useEffect(() => {
        setIsMounted(true)
        if(queryLanguage){
            setLanguage(queryLanguage.lang)
        }
    },[queryLanguage])

    // 挂载前返回空避免hydration不匹配
    if(!isMounted) return null
    // 后面的return逻辑保持不变

2. 统一给所有Link添加lang参数

修正所有Link组件的href写法,统一携带lang参数,不要手动拼接字符串:

首页跳转示例:

<Link 
  href={{ 
    pathname: '/', 
    query: { lang: language }
  }}
>
  <a className="app-logo">
    <img src="/images/sa-logo.svg" alt="" width={150} height={75}  />
  </a> 
</Link>

下拉菜单跳转示例(所有子菜单都按这个格式修改):

<Link 
  href={{ 
    pathname: '/settings/locations', 
    query: { lang: language }
  }}
>
  <a className="dropdown-item">{t('locations')}</a>
</Link>

3. 修正语言切换区域的判断逻辑

把嵌套三元运算替换为更稳妥的可选链判断,避免初始值为空时报错:

<div className="form-check form-check-inline multi-language-switch">
  {queryLanguage?.lang === 'en' && <img src="/icons/tick.png" alt="" width="20" height="20" />}
  <LanguageSwitcher lang="en">English</LanguageSwitcher> |{' '}
</div>
<div className="form-check form-check-inline multi-language-switch">
  {queryLanguage?.lang === 'ar' && <img src="/icons/tick.png" alt="" width="20" height="20" />}
  <LanguageSwitcher lang="ar">Arabic</LanguageSwitcher>
</div>

4. 可选配置:添加默认语言回退

在next-export-i18n的配置文件中设置默认语言,避免lang参数完全丢失时直接抛出错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 14:45:03