react-intl 渲染反应组件作为 formatMessage 中的占位符

react-intl render react component as placeholder in formatMessage

我有一个组件,它使用 injectIntl-HOC,returns 一条消息

...
return (
  <Message>
    {intl.formatMessage({
      id: 'page.checkout.hint'
    }, {
      link: <b>{intl.formatMessage({ id: 'page.checkout.hint.hyperlink' })}</b>
    })}
  </Message>
)
...

我的语言文件如下所示:

...
"page.checkout.hint": "You're going to be redirected automatically. If nothing happens, please click {link}",
"page.checkout.hint.hyperlink": "here",
...

这导致:You're going to be redirected automatically. If nothing happens, please click [object Object]

如果我使用 <FormattedMessage id="page.checkout.hint" values={{ link: <b>{intl.formatMessage({ id: 'page.checkout.hint.hyperlink' })}</b> }}> 而不是正确呈现。

有人知道吗?

对象是因为你的插值 link 值实际上是一个 React b 组件,但需要一个字符串所以它只是在对象上做 toString 并输出到你插值link

FormattedMessage 如果您将 React 组件作为值传递给它,它会在幕后做一些工作,以在渲染输出中保持原样,利用作为 React 组件的所有好处。

但是 injectIntl 版本不会代表您完成这项工作。

虽然这不是推荐的方法,因为它混合了范例并从那一点开始利用了 React 的所有好处,但如果您有真正的理由在 injectIntl 中使用 HTML 字符串值在价值 FormattedMessage 的反应组件上,你可以作为最后的手段使用:

this.props.intl.formatHTMLMessage(
  {id: 'page.checkout.hint'}, 
  {link: `<b>${this.props.intl.formatMessage({ id: 'page.checkout.hint.hyperlink' })}</b>`}
)

这就是差异的原因,但是直接允许 HTML 字符串只是为了传统支持,所以如果可能的话应该避免