使用.map渲染多个React组件

时间:2016-03-02 19:07:29

标签: javascript reactjs

这可能是一个完整的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>
)

2 个答案:

答案 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}) />