有没有办法将 React 组件作为字符串而不是对象返回?

Posted

技术标签:

【中文标题】有没有办法将 React 组件作为字符串而不是对象返回?【英文标题】:Is there a way to return React Component as string instead of object? 【发布时间】:2019-10-22 10:26:34 【问题描述】:

我想介绍一个多语言系统。 我有一个函数组件,它根据所选语言(来自 Context API)返回特定元素的翻译。

在我将翻译后的元素放入表单(选项值、占位符等)之前一切正常 - 然后它显示为 [object object]。

这就是产生 2 个问题的地方:

    是否可以将此组件作为字符串返回,html 表单会接受哪些内容?

    是否可以将上下文消费者应用于纯 JS 函数,因此它不返回 React 组件,而是返回原始值?

翻译组件:

const Translation = ( element ) => 
  let translation;

  return (
    <LanguageConsumer>
      ( language ) => 
        switch (language) 
          case "pl":
            translation = plTranslation;
            break;

          case "en":
            translation = enTranslation;
            break;

          default:
            translation = enTranslation;
        

        return translation[element];
      
    </LanguageConsumer>
  );
;

例子:

<option value="en">
  <Translation element="globalLanguageEnglish" />
</option>

提前感谢您的帮助。

【问题讨论】:

你能分享一些代码吗? React 可以正确渲染string 对象。您很可能尝试渲染 context 对象或其他东西。 没有代码/上下文很难提供帮助。但是,从您所描述的内容来看,您似乎想根据其名称动态呈现组件。 const ComponentToRender = 'MyComponent'; 和使用它就像&lt;ComponentToRender /&gt;。因此,如果您有条件元素要渲染,您可以只传递组件 string 名称然后渲染它 对不起,我添加了一些代码。我想问题是我要返回整个消费者,而不仅仅是来自翻译对象的字符串元素。 还是不行。它总是以形式给出[object object]。即使您像const Value = () =&gt; "value" 那样做某事并将其传递给像&lt;input type="text" placeholder=&lt;Value /&gt; 这样的输入占位符。 :-( 在这种情况下,您只需将Value 称为function,而不是将其呈现为component&lt;input type="text" placeholder=Value() /&gt; 【参考方案1】:

我可以确认它不起作用 - &lt;option&gt; html 元素内容可以是“文本,可能带有转义字符(如 &amp;eacute;)。”

React 组件只能返回字符串,它完全有效(并且按照 OP 所述工作)...但 不支持此用例

使用组件只返回一个字符串不是一个好的选择。当您在一个组件中需要多个翻译字符串时,它可能无效。 React 必须将其作为组件进行管理,控制 props,渲染,进行协调等。许多相同类型(仅不同 props)的后续组件(兄弟姐妹)应该是key-ed。

更智能的解决方案: 在这种情况下,将一组选项(键)作为道具传递并使用一个组件在循环中呈现所有已翻译的&lt;option&gt; 元素(使用片段返回),例如像这样:

// get some translation fn f.e. from context
return (
  <>
    props.items.map( item => <option key="item" value="item">translate(item)</option> )
  </>
)

看看它是如何在 i18n 解决方案中完成的,例如 i18next 描述的 here - 传递函数 't' 并使用它来访问您的翻译。

【讨论】:

如果我想使用 React 的 useContext 并处理一些值然后将其作为原始字符串返回怎么办?有什么办法可以做到吗? 为什么有一个返回字符串的组件会更无效?您的回答没有给出任何有效的论据。 React 具有状态管理功能,在许多情况下,如果您仅在值更改时重新处理字符串,实际上会更有效。

以上是关于有没有办法将 React 组件作为字符串而不是对象返回?的主要内容,如果未能解决你的问题,请参考以下文章

React useState 覆盖状态对象而不是合并 [重复]

有没有办法在 Alamofire 中将数据作为对象而不是参数发送?

React在组件内部成为prop的一部分

有没有办法检查延迟加载的组件(使用 React.Lazy)是不是已完成加载?

有没有办法让 XmlReader 将字符引用保留为文本而不是转换它?

有没有办法通过遍历数组来动态地从 react-icons 导入?