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

Next.js切换语言后如何触发getServerSideProps并刷新页面?

Next.js 查询参数本地化:切换语言触发SSR与检测方案

核心问题修正与方案

你当前的代码存在两个关键问题:一是getServerSideProps错误使用了context.locale(这是Next.js内置路由本地化的属性,而非查询参数);二是router.push的调用方式不对,导致未触发服务器端渲染。以下是具体解决方案:


1. 修正getServerSideProps:从查询参数获取语言

因为你使用?lang=en这种查询参数方式做本地化,所以需要从context.query中读取语言值,同时设置默认语言兜底:

export const getServerSideProps = async (context) => {
  // 从查询参数取语言,默认值设为'en'
  const locale = context.query.lang || 'en';
  const data = await fetchData(locale);

  return {
    props: data,
    // 如果数据为空返回404,按需调整
    notFound: !data?.index 
  };
};

2. 修复语言切换函数:触发getServerSideProps

当前的router.push调用未正确修改查询参数,因此无法触发服务器端重新获取数据。调整为直接修改URL的查询参数:

const changeLanguage = (newLang) => {
  // 基于当前路由,替换/新增lang查询参数
  router.push({
    pathname: router.pathname,
    query: { ...router.query, lang: newLang }
  });
};
  • 这种方式会触发getServerSideProps,因为页面配置了服务器端渲染逻辑,Next.js会在导航时重新执行该函数获取对应语言的数据。
  • 如果上述方式仍未触发SSR,可以改用强制页面刷新(适合不需要客户端过渡的场景):
    const changeLanguage = (newLang) => {
      const currentUrl = new URL(window.location.href);
      currentUrl.searchParams.set('lang', newLang);
      window.location.href = currentUrl.toString();
    };
    

3. 正确检测语言切换

在客户端可以通过监听路由变化来检测语言切换,同步本地状态:

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

const Index = ({ index }) => {
  const router = useRouter();
  const [currentLang, setCurrentLang] = useState(router.query.lang || 'en');

  useEffect(() => {
    // 监听路由完成事件,更新当前语言
    const handleLangChange = () => {
      setCurrentLang(router.query.lang || 'en');
    };

    router.events.on('routeChangeComplete', handleLangChange);
    // 组件卸载时移除监听
    return () => router.events.off('routeChangeComplete', handleLangChange);
  }, [router]);

  // ...其余代码
};

这样每次语言切换后,currentLang会自动更新,你可以基于这个状态做客户端的UI适配(比如切换语言按钮的高亮状态)。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 16:20:32