从字符串动态呈现组件:ReactJS

时间:2018-02-19 09:55:15

标签: reactjs

我试图像这样动态调用组件

var Tagname = 'Species';
options.push(<Tagname {...attrs}/>);

我在控制台中收到警告

Warning: <Species /> is using uppercase HTML. Always use lowercase HTML tags in React.
Warning: The tag <Species> is unrecognized in this browser. If you meant to render a React component, start its name with an uppercase letter.

所有其他代码都运行正常。但是这个组件不起作用。 我该如何解决这个问题?

1 个答案:

答案 0 :(得分:9)

是的,您可以动态调用组件,但它应该是组件本身而不是字符串。

像这样:

var Tagname = Species;    //component itself, not string
<Tagname {...attrs}/>;

因为JSX会编译成React.createElement(Component, props, ...children)Component将是一个字符串,如果它是一个html标记,否则是一个反应组件。

因此,如果您传递React.createElement("Species", props, ...children),则反应会将其视为html标记,而不是反应组件。

<强>更新

你可以做一件事,为每个组件创建一个地图,如下所示:

const Map = {
  "componenet1": Component1,
  "componenet2": Component2
}

现在您可以使用字符串键访问组件,如下所示:

let name = "componenet1";
let Tagname = Map[name];
<Tagname {...attrs}/>;