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

如何在Next.js中无需Context传递全局本地化数据至页面组件

解决Next.js本地化数据无需Context Provider的方案

问题现状

目前通过API获取本地化键值数组数据,使用Context Provider传递给子组件,但所有使用本地化数据的组件必须改为客户端组件,不符合需求。数据仅需每日重新验证一次,希望改用服务端方式传递,让page.jsx拥有languages属性,用普通函数筛选数据。

解决方案步骤

1. 封装带缓存的本地化数据获取函数

创建服务端工具函数,利用Next.js的缓存机制将数据缓存24小时,避免重复请求:

// app/utils/localization.js
import post_req from './your-post-req-path'; // 替换为你的post_req实际路径

export async function getLocalizationData() {
  // 缓存24小时,revalidate设置为86400秒
  const res = await post_req(
    process.env.LANG_GET_TRANSLATELIST,
    false,
    { AddLang: true, list: TranslationByPage },
    false,
    { next: { revalidate: 86400 } } // 添加缓存配置,控制刷新频率
  );
  return res.data?.Data?.list || [];
}

2. 创建普通筛选函数替代钩子

把原来的useLanguage钩子改造成普通函数,直接接收本地化数据和formKey:

// app/utils/localization.js
export function getLocalizedValue(localizationData, formKey) {
  const _languages = localizationData.find(el => Array.isArray(el));
  const _value = _languages?.find(el => el.FormKey === formKey);
  return _value?.Value || _value?.Key || '';
}

3. 在Page组件中直接使用

在每个page.jsx(服务端组件)中调用获取数据的函数,拿到languages后使用筛选函数:

// app/your-page/page.jsx
import { getLocalizationData, getLocalizedValue } from '@/app/utils/localization';

export default async function YourPage() {
  const languages = await getLocalizationData();

  // 直接用普通函数筛选翻译值
  const welcomeText = getLocalizedValue(languages, 'welcome_key');

  return (
    <div>
      <h1>{welcomeText}</h1>
    </div>
  );
}

4. (可选)向子组件传递数据

如果需要在子组件(服务端组件)中使用,直接将languages作为props传递,无需改为客户端组件:

// app/your-page/page.jsx
import { getLocalizationData } from '@/app/utils/localization';
import ChildComponent from './ChildComponent';

export default async function YourPage() {
  const languages = await getLocalizationData();

  return (
    <div>
      <ChildComponent languages={languages} />
    </div>
  );
}

// app/your-page/ChildComponent.jsx (服务端组件)
import { getLocalizedValue } from '@/app/utils/localization';

export default function ChildComponent({ languages }) {
  const buttonText = getLocalizedValue(languages, 'button_submit');
  return <button>{buttonText}</button>;
}

核心优势

  • 所有组件保持服务端组件身份,无需添加'use client'指令
  • 数据自动缓存24小时,符合每日验证的需求
  • 用普通函数替代钩子,彻底摆脱Context带来的客户端依赖

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 15:57:44