这可能是一个完整的noob问题,但我无法解决这个问题。我有一个React组件,在它的render方法中,我想渲染一些动态传递的组件(通过props)。
这是我从渲染方法返回的(ES6,用Babel编译)
return (
<div className={openState}>
/* Shortened for brevity*/
{this.props.facets.map(function(f) {
var CompName = facetMap[f.type]
return <CompName key={f.id} />
})}
/* Shortened for brevity*/
</div>
)
facetMap
只是一个将字符串与传入的“类型”匹配的映射。我似乎无法在页面上实际呈现组件。
我将.map()方法的结果存储在var中,然后将其记录到控制台,并显示了一组组件。但是,render方法中的{facetComponents}
具有相同的结果。
编辑,对那些对解决方案感兴趣的人
因为我真的无法在任何地方找到答案,所以这是我完成的解决方案,感谢@Mathletics
//Components imported using ES6 modules
import OCFacetText from "./oc-facet-text"
// Etc...
//Later on, in my render method:
let facetMap = {
"text": OCFacetText,
"number": OCFacetNumber,
"numberrange": OCFacetNumberRange,
"boolean": OCFacetBoolean,
"checkbox": OCFacetCheckbox,
// Etc, etc...
}
let facetComps = facets.map(function(f) {
var CompName = facetMap[f.type]
return <CompName key={f.id} />
})
//Finally, to render the components:
return (
<div className={openState}>
/* Shortened for brevity*/
{facetComps}
/* Shortened for brevity*/
</div>
)
答案 0 :(得分:2)
恼人的一个。
如果需要动态组件名称,则必须使用React.createElement(CompName)
,其中CompName是字符串或类对象。
默认情况下,react会在上面的示例中查找名为CompName
的组件。
所以你的渲染函数看起来像这样:
return (
<div className={openState}>
/* Shortened for brevity*/
{this.props.facets.map(function(f) {
var CompName = facetMap[f.type]
return React.createElement(CompName, {key: f.id}) />
})}
/* Shortened for brevity*/
</div>
)
答案 1 :(得分:2)
从我收集的内容来看,听起来你的facetMap
是一个字符串集合:
var facetMap = {text: 'OCFacetText'}
但它实际上应该返回组件类:
var OCFacetText = React.createClass({...});
var facetMap = {text: OCFacetText};
然后(只有这时)你需要使用createElement
方法动态构建你的组件:
var CompName = facetMap[f.type]; // must be a FUNCTION not a string
return React.createElement(CompName, {key: f.id}) />