首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >呈现从HTML字符串中反应组件

呈现从HTML字符串中反应组件
EN

Stack Overflow用户
提问于 2018-03-21 14:28:30
回答 2查看 944关注 0票数 1

我从AJAX请求中得到一个HTML字符串,看起来如下所示:

代码语言:javascript
复制
<div> <SpecialComponent/> <SecondSpecialComponent/></div>

我需要的是能够在React组件中使用这个字符串,因为它是有效的JSX。

我试着按照本讨论中的指示使用dangerouslySetInnerHTMLhow-to-parse-html-to-react-component

我也尝试过像react-html-parsehtml-react-parser这样的反应库。未获成功

当我使用AngularJS(1)时,我使用了一些小指令来处理这种情况。我需要用反应来达到同样的目的。有什么想法吗?

编辑:如果有人感兴趣,我找到了一个处理这个问题的库:https://www.npmjs.com/package/react-jsx-parser

EN

回答 2

Stack Overflow用户

发布于 2018-03-21 15:42:48

你不应该这样做的。虽然在使用JSX时,React组件看起来像html标记,但它们实际上要么是类,要么是函数。您所要做的就相当于尝试解析:

代码语言:javascript
复制
"<div>document.write('foo')</div>"

您实际上是将字符串形式的javascript函数名与同一字符串中的html标记混合。您必须解析该字符串以将React组件从周围的html标记中分离出来,将字符串形式的React组件映射到实际的React对应项,并使用ReactDOM.render将该组件添加到页面中。

代码语言:javascript
复制
let mapping = [
    {"name":"<SpecialComponent/><SecondSpecialComponent/>","component":<SpecialComponent/><SecondSpecialComponent/>},
    {"name":"<someOtherComponent/><someOtherComponent/>","component":<someOtherComponent/><someOtherComponent/>}
];
let markup = "<div><SpecialComponent/><SecondSpecialComponent/></div>";
let targetComponent;

mapping.forEach((obj) => {if(markup.indexOf(obj.name)>-1){
    targetComponent=obj.component;//acquired a reference to the actual component
    markup.replace(obj.name,"");//remove the component markup from the string
    }
});

/*place the empty div at the target location within the page 
give it an "id" attribute either using element.setAttribute("id","label") or 
by just modifying the string to add id="label" before the div is placed in 
the DOM ie, <div id='label'></div>*/

//finally add the component using the id assigned to it

ReactDOM.render(targetComponent,document.getElementById("label"));

以前从没试过这个。我想知道这是否真的有效:)

票数 -1
EN

Stack Overflow用户

发布于 2018-03-21 14:39:12

我的建议是你做如下事情。

首先,将状态变量设置为等于要返回的HTML。

代码语言:javascript
复制
this.setState({html: response.data.html})

然后在您返回时,您可以执行以下操作

代码语言:javascript
复制
   return ( 
   {this.state.html} 
   );
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49408979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档