【发布时间】:2018-04-12 12:04:23
【问题描述】:
我想为导入的组件动态创建 JSX 标签。所以我的想法是这样的:
import DemoComponent from './DemoComponent';
class DynamicRendering extends Component {
assembleResult() {
const {
democomponent
} = this.props;
const result = [];
if (democomponent) {
const Tag = `DemoComponent`;
result.push(<Tag />);
}
return result;
}
render() {
const result = this.assembleResult();
return result;
}
}
我的想法是我可以将几个不同的 props 传递给组件,然后组件动态地创建 JSX 标签并将它们组装在一起。我想要这个的原因是我有大约 15 个要动态渲染的组件。我宁愿对它们进行循环并在需要时动态创建它们,而不是隐式地编写它们。这样我就可以保持这个组件干燥。
上面代码的问题是,如果你像这样创建一个Tag,它将把它当作一个HTML元素。这会导致错误,因为没有像“DemoComponent”这样的 HTML 元素。我设法通过创建道具名称到应该加载的组件的映射来解决这个问题。请参见下面的示例:
import DemoComponent from './DemoComponent';
const PROP_MODULE_MAP = new Map([
['democomponent', DemoComponent]
]);
class DynamicRendering extends Component {
assembleResult() {
const {
democomponent
} = this.props;
const result = [];
if (democomponent) {
const Tag = PROP_MODULE_MAP.get('democomponent');
result.push(<Tag />);
}
return result;
}
render() {
const result = this.assembleResult();
return result;
}
}
但我想知道是否有比创建此地图更简单的方法。还有其他方法可以动态创建代表导入组件的 JSX 标签吗?
【问题讨论】:
-
你能添加一个例子来说明你的动态组件列表是怎样的吗?
-
使用
React.cloneElementzhenyong.github.io/react/docs/… -
如果存储组件类型的变量没有大写,它只会将其视为 html 元素。这是因为
jsx仅将大写名称视为组件。另请参阅我的回答和User-Defined Components Must Be Capitalized。
标签: javascript reactjs jsx