当前位置: 首页 > 面试题库 >

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

汤承允
2023-03-14
问题内容

我有一个小反应页面,应该编译并显示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')
);

上面代码的结果只是一个字符串,我想知道是否有一种方法可以将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>

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

提前致谢

编辑:代码在这里


问题答案:

我最初提供了一个关于如何将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'));


<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>

情况2-您的字符串尚未准备好,需要其他逻辑才能插入

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

  • 如果所需的操作是简单且相当静态的,则可以使用regex。尽管这种方法有局限性。这种方法的用例可能是操纵DOM类或向字符串添加元素
  • 另一种方法是使用诸如html-to-react之类的库,它可能会帮助您找到所需的内容。
  • 最后,如果您正在使用Babel(几乎可以肯定),则可以使用Babel变压器。您所需babel-core要做的就是导入代码并将字符串转换为JSX。与使用库相比,此方法可能更受限制,但足够了。

这是从上方实现第3点的方法:

Babel.transform(code, options);

code您的html字符串在哪里。在其中,options我们需要传递一个对象,{presets: ['react']}以使Babel理解将JSX作为我们的输出。您当然也可以在此处添加其他选项。

这将返回一个对象,其中包含诸如源映射之类的东西,但是我们仅对此处生成的代码感兴趣。因此,我们需要添加:

Babel.transform(code, options).code;

请注意,这code是字符串格式的javascript代码,它表示一个函数调用,以创建一个React元素React.createElement。要将字符串作为javascript中的代码执行,我们可以使用eval()

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

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

var App = ({html}) => {
  var Component = Babel.transform(htmlFromApi, {presets: ["react"]}).code;
  return <div>{eval(Component)}</div>;
};

var Button = ({color, children}) => (
  <button style={{backgroundColor: color}}>{children}</button>
);

ReactDOM.render(<App />, document.getElementById("app"));


<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="app"></div>

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



 类似资料:
  • 假设有一串后台转换完成的JSX字符串,在React18中要如何解析成真实的React Element呢?要求事件绑定,属性绑定仍然能生效。

  • 我有JSX代码,但它在一个字符串中。试图将该代码注入React组件中的其他JSX中,但遇到了问题。。。 我使用的是危险的HTML,但是JSX被当作HTML处理。我有JSX格式的className=“test”。。。因此,当呈现时,它具有HTML测试类(红色背景) 它正在插入字符串变量,但是当你检查它时,输出是这样的:(你可以看到外部div的类名称现在是类,但是插入的字符串仍然被视为类名称

  • 问题内容: 这是我当前的XML。如果只列出一个列表,一切都会好起来的。 问题是需要一个字符串数组。 春天怎么办? 问题答案: 您应该使用: 一个数组可以包含多个内部bean,ref,collection或value元素。即使当被定义为例如值类型为Object的映射的值时,此配置元素也始终会导致一个数组。 您还可以指定要传递的值类型: 值类型 嵌套值的默认Java类型。必须是完全合格的班级名称。

  • 问题内容: 希望实现以下目标: 显然,这可以编译为: JSX中有一种优雅的方法来评估字符串中的表达式吗? 问题答案: 试试这个: 请记住,和之间的所有内容都只是Javascript,因此将表达式设置为DOM节点的类。

  • 我正在有条件地设置我的