将 JSX 格式的字符串注入 React 组件

Ran*_*ana 2 html javascript reactjs babeljs

我有一个小的反应页面,应该编译和显示 html 字符串。用react-foundation编写的字符串中的 html

该页面如下所示:

import * as React from 'react';
import * as ReactDOM from 'react-dom';
import { Link, Button, Colors } from 'react-foundation';
require('./foundation.css')

var htmlFromApi = '<div className="button-basics-example"><Button color={Colors.SUCCESS}>Save</Button><Button color={Colors.ALERT}>Delete</Button></div>';

var App = ({ html }) => { return <div>{html}</div> }

ReactDOM.render(
<App html={htmlFromApi}/>,
document.getElementById('react')
);
Run Code Online (Sandbox Code Playgroud)

上面代码的Result只是一个字符串,我想知道有没有办法将html字符串转换为react元素

像这样:

var reactElement= toReactElement(htmlFromApi);
//the result is <div className="button-basics-example"><Button color={Colors.SUCCESS}>Save</Button><Button color={Colors.ALERT}>Delete</Button></div>
Run Code Online (Sandbox Code Playgroud)

PS我试过了 <div className="content" dangerouslySetInnerHTML={{ __html: htmlFromApi }}></div>,没有用

提前致谢

编辑:代码在这里

Chr*_*ris 6

我最初提供了一个关于如何将字符串作为 HTML 直接插入 React 的答案。但是,由于您还希望在将字符串插入 React 之前解析字符串中的变量(以及其他潜在的逻辑),因此我将这两个选项留在这里,因为它们可能对未来的读者有用。


案例 1 - 您的字符串已准备好插入

如果包含您的 HTML 的字符串已准备好直接插入 React,并且不包含需要首先解析的代码,您应该使用dangerouslySetInnerHTML. 您应该将它设置在包含从您的 API 获取的 HTML 的包装 div 上。

请参阅下面的示例。

var htmlFromApi = '<div className="button-basics-example"><Button color={Colors.SUCCESS}>Save</Button><Button color={Colors.ALERT}>Delete</Button></div>';

var App = ({html}) => { return <div dangerouslySetInnerHTML={{ __html: html}}></div> }

ReactDOM.render(<App html={htmlFromApi}/>, document.getElementById('app'));
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.js"></script>
<div id="app"></div>
Run Code Online (Sandbox Code Playgroud)


案例 2 - 您的字符串尚未准备好,需要额外的逻辑才能插入

如果您的字符串还没有“准备好”直接注入 DOM,但需要先进行某种处理(例如,您的字符串包含需要首先解释的变量),事情会变得更加复杂。不幸的是,没有好的或“推荐”的方法来做到这一点。

  • 如果所需的操作简单且相当静态,您或许可以使用正则表达式。虽然这种方法有局限性。这种方法的用例可能是操作 DOM 类或向字符串添加元素。
  • 另一种方法是使用一个库,比如html-to-react,它可能会帮助你找到你想要的东西。
  • 最后,如果你正在使用 Babel(你几乎可以肯定是),你可以使用 Babel 转换器。您只需要导入babel-core代码并将字符串转换为 JSX。这种方法可能比使用库更受限制,但应该足够了。

以下是如何从上面实现第 3 点:

Babel.transform(code, options);
Run Code Online (Sandbox Code Playgroud)

code你的 html 字符串在哪里。在options我们需要传递一个对象,具有{presets: ['react']}使巴贝尔了解,希望JSX作为我们的输出。您当然也可以在此处添加其他选项。

这将返回一个包含源映射等内容的对象,但我们只对此处生成的代码感兴趣。所以我们需要添加:

Babel.transform(code, options).code;
Run Code Online (Sandbox Code Playgroud)

请注意,这code是字符串格式的 javascript 代码,它表示使用React.createElement. 要在 javascript 中将字符串作为代码执行,我们可以使用eval().

然后我们可以将这个 React 元素添加到我们的 React 组件中并正常渲染它,如下面的示例所示。


Babel.transform(code, options);
Run Code Online (Sandbox Code Playgroud)
Babel.transform(code, options).code;
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息Babel.transform,请参阅官方文档