【发布时间】:2016-06-27 17:48:59
【问题描述】:
我是 React 的新手(我更容易使用 jQuery 或 AngularJS)。我有一个特殊情况,我没有找到解决它的好方法......
我的应用程序包含一个类似于“文档查看器”的区域。它从后端加载 HTML 内容(通过 API,使用 Fetch)并将其注入“查看器”组件。加载的 HTML 内容看起来像“大学报告”(它只是一个格式化文本,只有 <span> 和 <p> 带有 class="..." 属性,仅此而已)。
例如:<p>Lorem ispum <span>some text</span> loreb bis <span>ipsum</span></p> ...
我加载内容,并以这种方式将其注入我的组件 <Viewer> 的 render() 中:
<div dangerouslySetInnerHTML={ getFreshlyLoadedHTML() } />
简单,它工作得很好!
但是...现在,我想在加载的 HTML 中注入一些“交互式”组件。例如,提供反馈的按钮等。API 必须决定在格式化文本 (HTML) 的单词/节点之间放置组件的位置。
前任 :
<p> Lorem ispum <span>some text</span>
loreb bis <span>ipsum</span>
<MyFeedbackButton paragraph="1.3"/>
</p><p>Other Lorem Ipsum<p><span>...</span>
在那里,我被困住了,因为如果加载的 HTML 中有组件,我无法使用 dangerouslySetInnerHTML...
第一次尝试:我尝试修改 API,而不是将字符串中的 HTML 发送到应用程序,而是发送一个自定义 JSON 结构,该结构几乎代表了我想要的最终 JSX 结构。然后,在我的反应页面中,渲染函数只需要解析 JSON 并构建 JSX(如果不清楚,这里是一个 JsFiddle 示例:https://jsfiddle.net/damienfa/69z2wepo/34536/)
它有效,但我不敢相信这是个好方法......
我看到一个主要问题:我从渲染函数构建的所有 HTML 节点(跨度,p...)都被 reactJs 引用,真的有必要吗?大多数情况下,有“死”节点(我的意思是,永远不会改变的 dom 节点,这是静态格式的文本)。
看看那些永远不会交互的节点上的所有“data-reactid”......
您对此案有何建议?
我对 API 发送的 JSON 结构的尝试怎么样?
有没有办法说“不要引用那个元素”?
你清楚地看到我的问题的更好解决方案吗?
【问题讨论】:
-
我认为发送可以转换为 JSX 的 JSON 是一个明智的选择,您提到的该解决方案的主要问题实际上是 React 的一部分,我认为这实际上不是一个主要问题?除了一个非常小的性能问题,我认为这不会是一个大问题
-
我同意@Geraint,不用担心开销,它很可能可以忽略不计。但是是否需要将内容作为 HTML 获取,是否还需要在获取的内容之间添加按钮?
标签: reactjs components jsx