提问人:howrad 提问时间:10/4/2020 更新时间:4/8/2021 访问量:1845
将字符串转换为React JSX
Convert string to React JSX
问:
目标:我想将包括 React 组件在内的字符串转换为功能齐全的 JSX。
更简单的例子是,Stack Overflow 上有许多解决方案,是这样的:
render()
{
let txt = "<span><b>Hello World!</b></span>";
return <div dangerouslySetInnerHTML={{__html: txt}}></div>;
//---OR---
return ReactHtmlParser(txt); //using react-html-parser
//---OR---
return parse(txt); //using html-react-parser
}
但是,如果相反,其中 MyComponent 是一个自定义 React 组件,我找不到浏览器正确解释它的方法。let txt = "<MyComponent/>";
使用某些方法,它将以小写形式输入 DOM。通过其他技巧,我可以将其作为大写字母放入 DOM 中。但是浏览器不会将 MyComponent 解释为 React 组件,也不会执行里面的代码。<mycomponent><mycomponent/>
<MyComponent><MyComponent/>
我对答案不感兴趣,因为我不想一次将其用于一个组件。我想解析JSX的长字符串。React.createElement()
答:
0赞
Dennis Vash
10/4/2020
#1
没有库可以解析包含自定义 React 组件的字符串。
如果你考虑一下,这样的库需要知道你的组件位置,因为它需要导入和渲染它。此外,组件的实际名称在 React 中是没有意义的,你必须在范围内有它的实例可用。
因此,您唯一的解决方案是为您自己的编写自定义解析器。
这样的解决方案将大致包含一个字典,该字典将字符串映射到它们的组件(也需要处理道具和重复命名)。
import {MyComponent,Button} from 'components';
export const Components = {
MyComponent,
Button
};
myParser('<MyComponent/>'); // Match MyComponent
您可以使用 ReactDOMServer
,因此您有元素实例来呈现其 HTML。
评论
0赞
howrad
10/5/2020
Dennis,当你制作 React 小提琴时,JSFiddle 使用什么?在某种程度上,它必须执行在浏览器中以字符串形式出现的 React 代码。
0赞
Dennis Vash
10/5/2020
它不是,它只是在其他服务器上运行一台机器
0赞
Troy Alford
10/22/2021
@DennisVash实际上,这正是它的作用,正如您所说,它通过允许实现器提供名称到组件函数的映射来做到这一点。然后,解析器本质上充当 Jsx 的运行时解释器,并绑定到任何正在转换为本机 HTML 或已在映射中提供的组件。我是库的作者,所以我有偏见 - 但它可能是解决这个问题的好方法。react-jsx-parser
0赞
Steve Tomlin
4/8/2021
#2
您可以使用 -
- html-react-解析器
- react-jsx-解析器
评论
@mdx-js/runtime