我试图根据其类型动态呈现组件 .
例如:
var type = "Example";
var ComponentName = type + "Component";
return <ComponentName />;
// Returns <examplecomponent /> instead of <ExampleComponent />
我试过这里提出的解决方案React/JSX dynamic component names
这在编译时给了我一个错误(使用browserify for gulp) . 它期望我使用数组语法的XML .
我可以通过为每个组件创建一个方法来解决这个问题:
newExampleComponent() {
return <ExampleComponent />;
}
newComponent(type) {
return this["new" + type + "Component"]();
}
但这对我创建的每个组件都意味着一种新方法 . 必须有一个更优雅的解决方案来解决这个问题 .
我对建议很开放 .
8 回答
<MyComponent />
编译为React.createElement(MyComponent, {})
,它需要一个字符串(HTML标记)或一个函数(ReactClass)作为第一个参数 .您可以将组件类存储在名称以大写字母开头的变量中 . 见HTML tags vs React Components .
编译成
这里有一个关于如何处理这种情况的官方文档:https://facebook.github.io/react/docs/jsx-in-depth.html#choosing-the-type-at-runtime
基本上它说:
错误:
正确:
我想出了一个新的解决方案 . 请注意我使用的是ES6模块,所以我要求上课 . 您也可以定义一个新的React类 .
如果您的组件是全局的,您可以简单地执行:
对于包装器组件,一个简单的解决方案是直接使用
React.createElement
(使用ES6) .我使用了一些不同的方法,因为我们总是知道我们的实际组件,所以我想应用switch case . 在我的案例中,组件的总数没有大约7-8 .
我们希望通过动态组件加载来访问各种视图 . 下面的代码给出了一个如何通过使用从URL的搜索字符串解析的字符串来实现此目的的工作示例 .
让我们假设我们想要使用这些url路径访问具有两个独特视图的页面'snozberrys':
和
我们像这样定义视图的控制器:
编辑:其他答案更好,请参阅评论 .
我这样解决了同样的问题: