【发布时间】:2018-06-16 20:29:43
【问题描述】:
目前,我正在使用 marked 将 Markdown 转换为 HTML 代码,然后将其中的某些部分替换为 React 元素。这会产生一个 HTML 字符串和 React 元素的数组,确实可以呈现:
const prepareGuide = markdown => replaceToArray(
marked(markdown),
/<a href="SOME_SPECIAL_HREF".*?>(.*?)<\/a>/,
(match, label, slug) => <a href={`/${slug}`}>{label}</a>
)
const Guide = ({ guide }) =>
prepareGuide(guide.fields.text).map(
n => typeof n === 'object'
? n
: <span dangerouslySetInnerHTML={{ __html: n }} />
)
这个问题,我们称之为解决方法,是每段 HTML 都需要一个包装器元素,例如 span(并使用 dangerouslySetInnerHTML)。
我基本上需要的是能够用 React 组件替换呈现的 HTML 元素,以添加 React 功能,如路由器链接和其他自定义元素。
还有其他方法吗?
编辑:我使用的replaceToArray 函数类似于String.prototype.replace,但返回一个数组(因此可以返回任何类型)
编辑:我的另一种方法是将 HTML 直接渲染到 DOM(使用 dangerouslySetInnerHTML),并使用容器元素的 ref 来查询我想要替换的所有元素。但是,下一个问题:要在我拥有的 HTML ref 中呈现 React 组件,我需要另一个 React 根,这是可能的,但不切实际,因为我会丢失所有上下文(如路由器),所以我什至不能以这种方式正确使用路由器链接。
【问题讨论】: