这是它从字符串内容工作的方式,而不像其他人建议的那样将您的组件作为静态链接代码嵌入到您的包中。
import React from 'react';
import { Button } from 'semantic-ui-react';
import createReactClass from 'create-react-class';
export default class Demo extends React.Component {
render() {
const s = "return { render() { return rce('div', null, rce(components['Button'], {content: this.props.propA}), rce(components['Button'], {content: 'hardcoded content'})); } }"
const createComponentSpec = new Function("rce", "components", s);
const componentSpec = createComponentSpec(React.createElement, { "Button": Button });
const component = React.createElement(createReactClass(componentSpec), { propA: "content from property" }, null);
return (
<div>
{component}
</div>
)
}
}
React 类规范在 string 中s
。请注意以下事项:
rce
代表React.createElement
并在调用时作为第一个参数给出createComponentSpec
。
components
是一个额外组件类型的字典,并在调用时作为第二个参数给出createComponentSpec
。这样做是为了您可以提供具有冲突名称的组件。
例如,字符串Button
可以解析为标准 HTML 按钮,或语义 UI 中的按钮。
您可以轻松地生成内容s
通过https://babeljs.io中所述https://reactjs.org/docs/react-without-jsx.html。本质上,字符串不能包含 JSX 内容,并且必须是纯 JavaScript。这就是 BabelJS 通过将 JSX 翻译成 JavaScript 所做的。
您需要做的就是替换React.createElement
为rce
,并通过components
字典解析外部组件(如果您不使用外部组件,则可以跳过字典的内容)。
这相当于上面代码中的内容。里面<div>
有两个 Semantic UIButton
也是一样。
JSX 渲染()代码:
function render() {
return (
<div>
<Button content={this.props.propA}/>
<Button content='hardcoded content'/>
</div>
);
}
BabelJS 将其翻译为:
function render() {
return React.createElement("div", null, React.createElement(Button, {
content: this.props.propA
}), React.createElement(Button, {
content: "hardcoded content"
}));
}
并且您按照上面所述进行更换:
render() { return rce('div', null, rce(components['Button'], {content: this.props.propA}), rce(components['Button'], {content: 'hardcoded content'})); }
调用createComponentSpec
函数将为 React 类创建规范。
然后将其转换为实际的 React 类createReactClass
。
然后用React.createElement
.
您需要做的就是从主组件render
func返回它。