gpt4 book ai didi

javascript - 如何使用 React.createElement 基于 prop 或变量动态创建组件

转载 作者:行者123 更新时间:2023-11-30 16:19:18 25 4
gpt4 key购买 nike

我有两种类型的组件,例如 <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 .您需要将这些项目包含在顶级元素中,可以是另一个组件,也可以是 DOM 元素(<div><span> 或类似元素)。

至于将组件作为 prop 传入,没有理由不能这样做:

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

关于javascript - 如何使用 React.createElement 基于 prop 或变量动态创建组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34983041/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com