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

React Native非组件内使用react-i18next的t()函数报错求助

解决React Native中i18next在非组件文件里的输入验证错误

嘿,我来帮你搞定这个问题!你遇到的TypeError: n is not a function本质上是两个小问题导致的:一是你在非组件文件里误用了React Hook,二是调用验证函数时t参数没正确传递。下面给你一步步拆解解决方案:


先理清核心问题

  1. 不能在普通函数里用useTranslation:useTranslation是React Hook,只能在React组件或自定义Hook里使用,你在RegisterValidator.js这个普通工具文件里导入它完全没用,反而会埋下隐患。
  2. t参数未正确传递:错误提示里的n就是你传入的t,说明调用RegisterValidator时,这个参数要么没传,要么传了undefined,导致调用它的时候报错。

方案一:直接用i18next实例(最省心,推荐)

既然你已经在i18n.js里配置好了i18next实例,直接在验证器里导入使用就行,不用手动传t参数:

修改RegisterValidator.js

// 删掉没用的useTranslation导入,换成你自己配置的i18next实例
import i18next from './i18n'; // 注意路径要和你的项目结构匹配

const RegisterValidator = (type, value, email) => {
  let validated = true;
  let warningMsg = '';
  switch (type) {
    case 'username':
      if (!value.includes(' ')) return [true, ''];
      else {
        // 直接用i18next.t()获取翻译
        warningMsg = i18next.t('errorMessages.username');
        return [false, warningMsg];
      }
    case 'email':
      // 示例:添加邮箱匹配的验证逻辑
      if (value !== email) {
        warningMsg = i18next.t('errorMessages.emailNoMatch');
        return [false, warningMsg];
      }
      return [true, ''];
    default:
      return [validated, ''];
  }
};

export default RegisterValidator;

之后在组件里调用时,就不需要传t了:

// 组件内调用示例
const [isValid, errorMsg] = RegisterValidator('username', inputUsername, userEmail);

方案二:手动传递t参数(适合需要动态传参的场景)

如果你坚持要通过参数传递t,那得确保在组件里正确获取t并完整传递:

第一步:修正RegisterValidator.js

先删掉没用的Hook导入,再加个兜底判断防止t没传:

// 删掉这行:import { useTranslation } from 'react-i18next';

const RegisterValidator = (type, value, email, t) => {
  // 先判断t是否有效,避免报错
  if (!t || typeof t !== 'function') {
    console.warn('t函数未正确传递');
    return [false, '验证出错'];
  }
  
  let validated = true;
  let warningMsg = '';
  switch (type) {
    case 'username':
      if (!value.includes(' ')) return [true, ''];
      else {
        warningMsg = t('errorMessages.username');
        return [false, warningMsg];
      }
    case 'email':
      if (value !== email) {
        warningMsg = t('errorMessages.emailNoMatch');
        return [false, warningMsg];
      }
      return [true, ''];
    default:
      return [validated, ''];
  }
};

export default RegisterValidator;

第二步:在组件里正确传递t

在注册相关的组件里,先用useTranslation获取t,再传给验证器:

import { useState } from 'react';
import { useTranslation } from 'react-i18next';
import RegisterValidator from './RegisterValidator';

const RegisterScreen = () => {
  const { t } = useTranslation();
  const [username, setUsername] = useState('');
  const [email, setEmail] = useState('');
  const [confirmEmail, setConfirmEmail] = useState('');

  const handleValidate = () => {
    // 这里必须把t作为第四个参数传进去
    const [usernameValid, usernameMsg] = RegisterValidator('username', username, email, t);
    const [emailValid, emailMsg] = RegisterValidator('email', confirmEmail, email, t);
    
    // 处理验证结果...
  };

  return (
    // 你的组件UI代码
  );
};

export default RegisterScreen;

额外小提醒

  1. 检查你的翻译文件:确保errorMessages.username、errorMessages.emailNoMatch这些键在common_en.json和common_de.json里都有对应的翻译值,不然t函数会直接返回键名。
  2. 清理冗余依赖:你的App.js里同时导入了i18n-js和i18next,其实你已经用i18next做配置了,i18n-js可以删掉,避免混淆。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:20:31