【问题标题】:How do i replace some text template with a custom JSX Component in ReactJS?如何在 ReactJS 中用自定义 JSX 组件替换一些文本模板?
【发布时间】:2019-04-14 14:04:49
【问题描述】:

这就是翻译文本字符串并在 JSX 中实现它们。

假设我有两个字符串。一个用于英语,另一个用于西班牙语,如下所示:

英语

const phrase = `this is just a string with some [replace]weird[/replace] link inside`

西班牙语

const phrase = `esto es solo un string con un [replace]raro[/replace] enlace dentro`

当我处于英语模式时,字符串当然会作为第一个示例。

我正在尝试用这样的组件替换 [/replace] 中的 [replace] 单词。

<p dangerouslySetInnerHTML={{
    __html: phrase.replace(/\[replace\](.*)\[\/replace\]/, <Link to={linkurl} >test</Link>)
}}>

输出是:这只是一个字符串,里面有一些 [object Object] 链接

这个很好用,只使用普通的html标签

<p dangerouslySetInnerHTML={{
    __html: phrase.replace(/\[replace\](.*)\[\/replace\]/, "<b>$1</b")
  }}>
</p>

输出是:这只是一个字符串,里面有一些奇怪的链接

我还尝试了以下方法:

<p dangerouslySetInnerHTML={{
    __html: phrase.replace(/\[replace\](.*)\[\/replace\]/, "<Link to=\""+linkurl+"\">$1</Link>")
  }}>
</p>

输出为:this is just a string with some weird link inside

但是“奇怪”这个词应该是一个链接元素,而不是......

顺便说一下,该组件只是 gatsby 的一个组件,它允许您使用路由导航(当前使用到达路由器)。

【问题讨论】:

  • 问题是 JSX 代码 &lt;Link to={linkurl} &gt;test&lt;/Link&gt; 将被转换为 React.CreateElement(...) 并且它最终确实是对象,您可以看到结果。检查:stackoverflow.com/questions/19266197/reactjs-convert-to-html 或者谷歌react to html
  • 问题是,为什么需要在变量中添加一个JSX对象呢?尝试添加组件并仅替换 url、文本或其他内容会更容易。您是否有特定的用例,因此我们可以提出替代方案?
  • @c-chavez 我同意这个论点,另一方面,有时您确实需要用静态标记替换 JSX。以下是该主题的更多信息:medium.com/@arkadiusz.machalica/…
  • @c-chavez 这些字符串来自一个数据库,由其他人翻译(我只是在这里使用了一个随机短语作为示例)。有时你需要一个短语或短语的单词之间的超链接,这取决于语言,所以我们只使用简单的模板格式,然后用适当的 html 代码替换它。但我们在这里与 React+Gatsby 交谈。
  • 我设法“让它工作”,至少让它使用 `ReactDOMServer.renderToString(anchor

标签: string reactjs jsx gatsby template-strings


【解决方案1】:

如果您将文本模板视为 Markdown,这很容易做到:

  1. 将关键字替换为 Markdown 链接语法 ([linked phrase](https://www.example.com/))
  2. 通过 markdown-to-jsx 运行 markdown 以将其转换为 JSX
  3. 使用 overrides 选项可使用带有 a 标签的自定义组件(例如,提取 href 并将其作为 Gatsby 的 Link 上的 to 属性提供的包装器)。

如果您想要更精简的流水线,您可以使用 dangerouslySetInnerHTML 拼凑一些东西,但它不会那么灵活或易于清理。

示例代码:

import * as React from "react"
import Link from "gatsby"
import Markdown from "markdown-to-jsx"

const MagicText = ({ children, linkUrl }) => (
  <Markdown
    options={{
      overrides: {
        replace: Link,
      },
    }}
  >
    {children
      .replace("[replace]", `<replace to=${linkUrl}>`)
      .replace("[/replace]", "</replace>")}
  </Markdown>
)

并在使用中:

<MagicText linkUrl="https://www.example.com/">{phrase}</MagicText>

【讨论】:

  • 很高兴您能理解我的问题!这个解决方案看起来很整洁。我会在几个小时内尝试一下,看看它是否像魅力一样起作用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-19
  • 1970-01-01
  • 2015-10-24
  • 2022-12-15
  • 2016-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多