【问题标题】:React - dangerouslySetInnerHTML being displayed as plain textReact - dangerouslySetInnerHTML 被显示为纯文本
【发布时间】:2021-05-20 19:06:07
【问题描述】:

我创建了一个显示招聘信息的 React 应用程序。当我单击列表中的职位发布时,会显示该职位发布的详细信息。

我正在尝试以与在源处格式化相同的方式显示职位发布的正文。为此,我尝试使用以下代码:

<div id="apply-now" className="apply-section">
    <h3>How to apply.</h3>
    <div dangerouslySetInnerHTML={{ __html: currentJob.description }}></div>
</div>

但是,在渲染组件时,内容并没有被格式化,而是以没有适当格式的纯文本显示。

这是一个没有被格式化的例子:

__"Application"__ 应为粗体字,网站链接应为实际链接,“点击此处获取申请表”链接也应如此。

我从 API 调用返回的数据与上面相同:

加入我们! - 我们期待您通过“申请”表格提交申请您的联系人:Ralph Ullmann 电话:089/ 5511 333783 https://www.consorsfinanz.de/karrierClick here for the application form!"

^^ 甚至在 StackOverflow 上也能正常工作!但我无法让它在我的应用程序中运行!

我已经花了好几个小时试图解决这个问题,但我什至不明白为什么它不起作用。

【问题讨论】:

  • 那么你的问题是如何设置它的样式?
  • @KonstantinModin 是的,与上面引用的文本中出现的方式相同。
  • __TEXT__ 不是粗体的 html,这是降价。要么使用某些东西来正确呈现降价,要么使用某种替换逻辑将附加在单词前面的__ 替换为&lt;strong&gt; 和附加在单词末尾的__&lt;/strong&gt;。跨度>
  • 您可以尝试一些库 react-markdownmarkdown-to-jsx 等.
  • 没错,你收到的是Markdown,和HTML完全不一样。

标签: javascript css reactjs dangerouslysetinnerhtml


【解决方案1】:

这听起来像是一个算法挑战。抱歉,我认为它可以以一种优雅的方式完成,但正则表达式会是更好的选择

  1. 使用正则表达式匹配两个下划线之间的任何内容
  2. 在每个匹配项中,替换删除下划线并将每个元素包装在strong 标签中

  const mdBoldToStrong = (text) => {
const surroundingUnderscores = new RegExp(/__(.*?)__/g)
return text
  .replace(surroundingUnderscores, (word) => {
    return `<strong>${word.replace(/__/g, '')}</strong>`
  })
  }

console.log(mdBoldToStrong('__Application__'))
console.log(mdBoldToStrong('Text__Application__Text__'))
console.log(mdBoldToStrong('__Text____Application__Text'))

如果您需要任何说明,请告诉我。

【讨论】:

  • 这不会将拆分的每一面都包含在强标签中吗?给定"Text __Bold__ Text",你最终会得到"&lt;strong&gt;Text &lt;/strong&gt;&lt;strong&gt;Bold&lt;/strong&gt;&lt;strong&gt; Text&lt;/strong&gt;"
  • @JacobSmit 你是对的。看起来这可能比看起来更具挑战性,秒
  • 如果只需要粗体样式,这应该可以解决问题。如果需要其他 markdown 样式,您可能仍想查看某种形式的 markdown 解析器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-18
  • 2022-01-23
  • 2012-01-31
  • 2013-05-19
  • 1970-01-01
  • 2013-01-25
相关资源
最近更新 更多