【问题标题】:Rendering Multiple React Components with .map使用 .map 渲染多个 React 组件
【发布时间】:2016-03-02 19:07:29
【问题描述】:

这可能是一个完整的菜鸟问题,但我无法弄清楚这一点。我有一个 React 组件,在它的渲染方法中,我想渲染一些动态传入的组件(通过道具)。

这是我从渲染方法返回的结果(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>
)

【问题讨论】:

  • 如果你只渲染一个组件,它可以工作吗?
  • 只是在页面上渲染组件?是的,这行得通。基本上,用例允许这些组件被重用和动态指定。
  • facetMap是一组字符串还是一组Component类? Dynamic component names 已在 SO 上得到很好的报道。
  • 只是字符串。我昨天在搜索中实际上遇到了这个问题。我希望我的开发人员能够传入“文本”而不​​是“OCFacetText”。

标签: javascript reactjs


【解决方案1】:

据我所知,听起来您的 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}) />

【讨论】:

  • 仅供参考,这正是我链接你的问题中所涵盖的解决方案,stackoverflow.com/questions/29875869/…
  • 我实际上看到了这个答案,但它对这种情况并没有太大帮助,尽管我可以看到两者是如何重叠的。
  • 两者重叠,因为它们相同。这是完全相同的问题。
【解决方案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>
)

【讨论】:

  • 不起作用。这个已经试过了。 React.createElement(CompName, {key: f.id}) 在功能上与 &lt;CompName key={f.id} /&gt; 相同
  • CompName 是字符串吗?我的解决方案假设它是。
  • 是的,它是一个字符串。
  • 这看起来像是我的权利。 CompName 引用的类是否已定义并在范围内?
  • 还可以根据文档将组件类作为第一个参数传递:facebook.github.io/react/docs/…
猜你喜欢
  • 1970-01-01
  • 2019-10-04
  • 2016-03-06
  • 2018-10-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-10
  • 2019-01-21
相关资源
最近更新 更多