簡體   English   中英

如何使用React.createElement基於prop或變量動態創建組件

[英]How can I dynamically create a component based on a prop or variable using React.createElement

我有2種類型的組件,例如<Promo /><Announcement />

我的組件之一映射到項目列表上並創建促銷或公告,我如何傳遞ItemElement,而不必基於if語句重復映射。

當前實施

import React, { Component } from 'react'
import Promo from './Promo'
import Announcement from './Announcement'

class Demo extends Component {

  render() {
    const { ItemElement } = this.props
    let items = null

    if(ItemElement === 'Promo'){

      items = this.props.items.map((p, i) => (
        <Promo item={p} />
      ))

    } else if(ItemElement === 'Announcement') {

      items = this.props.items.map((a, i) => (
        <Announcement item={a} />
      ))
    }

    return (
      { items }
    )
  }
}

所需的實現不起作用

import React, { Component } from 'react'
import Promo from './Promo'
import Announcement from './Announcement'

class Demo extends Component {

  render() {
    // this would be 'Promo' or 'Announcement'
    const { ItemElement } = this.props 

    let items = this.props.items.map((p, i) => (
      <ItemElement item={p} />
    ))

    return (
      { items }
    )
  }
}

如果我輸入一個'div''a''span'標記,但不是針對我自己的組件,這會很好地工作?

您的render()方法需要返回一個元素。 現在,您將返回一個具有單個屬性的javascript對象: items 您需要將這些項目包含在頂級元素,另一個Component或DOM元素( <div><span>等)中。

至於將組件作為道具傳遞,沒有理由您不應該這樣做:

class Demo extends React.Component {

  render() {
    // this would be 'Promo' or 'Announcement'
    const { ItemElement } = this.props 

    let items = this.props.items.map((p, i) => (
      <ItemElement item={p} />
    ))

    return <ul>{items}</ul>;
  }
}

class Promo extends React.Component {
  render() {
    return <li>Promo - {this.props.item}</li>; 
  }
}

class Announcement extends React.Component {
  render() {
    return <li>Announcement - {this.props.item}</li>;
  }
}

const items = [
  "foo",
  "bar"
];

ReactDOM.render(
  <Demo 
    ItemElement={Promo} // <- try changing this to {Announcement}
    items={items} 
  />,
  document.getElementById('app')
);

這是一個jsbin演示: http ://jsbin.com/cakumex/edit?html,js,console,output

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM