带有react-i18next的<Trans />组件中出现错误:渲染没有返回任何内容

问题描述 投票:0回答:2

当我尝试使用

react-i18next
Trans
组件插入一些 React 组件时,出现以下错误:

未捕获错误:Trans(...):渲染未返回任何内容。这通常意味着缺少返回语句。或者,若不渲染任何内容,请返回 null。

我像这样调用

Trans
组件:

<Trans
     t={l as TFunction}
     defaults="hello <chip>{{cohortName}}</chip> <bold>{{jobName}}</bold>"
     values={{
                cohortName,
                jobName,
     }}
     components={{
                chip: (
                  <Chip>
                    <></>
                  </Chip>
                ),
                bold: <strong />,
     }}
 />

我不明白为什么这是一个问题,因为根据 docs 这应该没问题。

我认为问题不在于

react-i18next
Trans 组件,但我不确定。有什么想法吗?

我尝试了另一种版本,其中使用模板作为

Trans
组件的返回值:

               <Trans
                  t={t}
                  defaults="hello <1>{{cohortName}}</1> <2>{{jobName}}</2>"
                  values={{
                    cohortName,
                    jobName,
                  }}
                >
                  Hello <Chip>{{ cohortName }}</Chip>{" "}
                  <strong>{{ jobName }}</strong>
                </Trans>

这会抛出:

Error: Objects are not valid as a React child (found: object with keys {cohortName}). If you meant to render a collection of children, use an array instead.

这导致我使用备用前缀和后缀进入托盘,如下所示:

<Trans
     t={t}
     defaults="hello <1>%%cohortName%%</1> <2>%%jobName%%</2>"
     tOptions={{
                interpolation: {
                  prefix: "%%",
                  sufix: "%%",
                },
     }}
     values={{
                cohortName,
                jobName,
     }}
     >
     Hello <Chip>%%cohortName%%</Chip>{" "}
     <strong>%%jobName%%</strong>
 </Trans>

没有抛出错误,但值

cohortName
jobName
呈现为纯文本,而不是来自
<Trans />
子组件的值。

javascript reactjs i18next react-i18next
2个回答
0
投票

Trans
组件可能会丢失
i18n
实例,它会自动从
I18nContext
获取,因此您必须通过
i18n
属性将其传递给组件。

更新代码:

const { l, 18n } = useTranslation(...);

<Trans
     t={l as TFunction}
     i18n={i18n}
     defaults="hello <chip>{{cohortName}}</chip> <bold>{{jobName}}</bold>"
     values={{
                cohortName,
                jobName,
     }}
     components={{
                chip: (
                  <Chip>
                    <></>
                  </Chip>
                ),
                bold: <strong />,
     }}
 />

-1
投票

对象不是有效的反应子对象:

                  Hello <Chip>{{ cohortName }}</Chip>{" "}
                  <strong>{{ jobName }}</strong>

记住 JSX 中的 { } 是转义为 javascript。 所以

{{ cohortName }}
只是评估
{ cohortName }
,它是
{'cohortName': cohortName }
的简写,它是一个对象。

并且对象不是有效的反应子对象。您可能只想在此处渲染字符串 colonyName

{cohortName}

至于“渲染没有返回任何内容”错误,我们必须查看 Trans 组件源代码来帮助解决。

© www.soinside.com 2019 - 2024. All rights reserved.