在地图函数中使用三元运算符会呈现两个结果
Using a ternary operator in a map function is rendering both results
我正在创建一个垂直时间轴,当您沿着时间轴移动时,卡片的两边交替出现,我正在尝试包含一个弹出效果以显示有关 person/event 的更多信息,该 person/event 填充了相对的空白时间线。
我试图通过在我的地图回调中使用三元运算符(使用模数按顺序交替边)来实现这一点,但它是 rendering/returning 两种可能的 Popover 结果,onClick 导致 Popover 弹出卡片的两面。
render() {
const cards = timelineObjects.map((card, i) => (
<React.Fragment key={i}>
{i % 2 === 0 ? (
<VerticalTimelineElement
className="vertical-timeline-element--work"
key={i}
iconStyle={{
background: "rgb(40,49,72)",
color: "#000"
}}
paddingTop="0em"
//icon={<Print/>}
>
<div>
<Card className="card">
<CardActionArea>
<CardMedia
style={{ height: 0, paddingTop: "100%" }}
image={card.image}
/>
<CardContent>
<Typography gutterBottom variant="h5" component="h2">
{card.title}
</Typography>
<Typography component="p">{card.subtitle}</Typography>
</CardContent>
</CardActionArea>
<Button
size="small"
color="primary"
component={Link}
//to={card.path}
onClick={this.handlePop}
>
Learn More, index: {i}, RIGHT
</Button>
<Popover
open={this.state.popped}
anchorEl={this.state.anchorEl}
anchorOrigin={{
horizontal: "right",
vertical: "center "
}}
transformOrigin={{
horizontal: "right",
vertical: "bottom"
}}
onClose={this.handleRequestClose}
>
Right popover text
</Popover>
</Card>
</div>
</VerticalTimelineElement>
)
:
(
<VerticalTimelineElement
className="vertical-timeline-element--work"
key={i}
iconStyle={{
background: "rgb(40,49,72)",
color: "#000"
}}
paddingTop="0em"
//icon={<Print/>}
>
<div>
<Card className="card">
<CardActionArea>
<CardMedia
style={{ height: 0, paddingTop: "100%" }}
image={card.image}
/>
<CardContent>
<Typography gutterBottom variant="h5" component="h2">
{card.title}
</Typography>
<Typography component="p">{card.subtitle}</Typography>
</CardContent>
</CardActionArea>
<Button
size="small"
color="primary"
component={Link}
//to={card.path}
onClick={this.handlePop}
>
Learn More, index : {i}, LEFT
</Button>
<Popover
open={this.state.popped}
anchorEl={this.state.anchorEl}
anchorOrigin={{
horizontal: "left",
vertical: "center "
}}
transformOrigin={{
horizontal: "left",
vertical: "bottom"
}}
onClose={this.handleRequestClose}
>
Left popover text
</Popover>
</Card>
</div>
</VerticalTimelineElement>
)}
</React.Fragment>
));
Here's a screen grab of the result.
您的弹出窗口都锚定到相同的元素 (this.state.anchorEl
),并且都配置为基于相同的布尔值 (this.state.popped
) 打开。这意味着如果您的时间轴中有 2 个以上的对象,您将为每个对象渲染一个弹出窗口,并且所有弹出窗口将一起打开或关闭,并且所有内容都将指向唯一锚元素的 left/right(无论是什么) .
您可能应该创建一个新的 TimelineObject
组件来呈现单个时间轴对象,并且可以拥有自己的本地状态并分配自己的本地 anchorEl
以将其弹出窗口锚定到。可能还有它自己的 popped
状态。那么您的地图功能将更像是:
timelineObjects.map((card, i) => <TimelineObject key={i} card={card} onLeft={i%2==0} />)
或者,不要将 this.state.popped
用作布尔值,而是将其用作卡片索引以显示弹出窗口。在你的 Popover
代码中做:
<Popover open={this.state.popped === i} ...
当您设置 popped
时,将其设置为 this.setState({popped: indexOfCardToShowPopover, anchorEl: elementOfCardToAnchorPopover });
这样一次只能打开 1 个弹出窗口。
我正在创建一个垂直时间轴,当您沿着时间轴移动时,卡片的两边交替出现,我正在尝试包含一个弹出效果以显示有关 person/event 的更多信息,该 person/event 填充了相对的空白时间线。
我试图通过在我的地图回调中使用三元运算符(使用模数按顺序交替边)来实现这一点,但它是 rendering/returning 两种可能的 Popover 结果,onClick 导致 Popover 弹出卡片的两面。
render() {
const cards = timelineObjects.map((card, i) => (
<React.Fragment key={i}>
{i % 2 === 0 ? (
<VerticalTimelineElement
className="vertical-timeline-element--work"
key={i}
iconStyle={{
background: "rgb(40,49,72)",
color: "#000"
}}
paddingTop="0em"
//icon={<Print/>}
>
<div>
<Card className="card">
<CardActionArea>
<CardMedia
style={{ height: 0, paddingTop: "100%" }}
image={card.image}
/>
<CardContent>
<Typography gutterBottom variant="h5" component="h2">
{card.title}
</Typography>
<Typography component="p">{card.subtitle}</Typography>
</CardContent>
</CardActionArea>
<Button
size="small"
color="primary"
component={Link}
//to={card.path}
onClick={this.handlePop}
>
Learn More, index: {i}, RIGHT
</Button>
<Popover
open={this.state.popped}
anchorEl={this.state.anchorEl}
anchorOrigin={{
horizontal: "right",
vertical: "center "
}}
transformOrigin={{
horizontal: "right",
vertical: "bottom"
}}
onClose={this.handleRequestClose}
>
Right popover text
</Popover>
</Card>
</div>
</VerticalTimelineElement>
)
:
(
<VerticalTimelineElement
className="vertical-timeline-element--work"
key={i}
iconStyle={{
background: "rgb(40,49,72)",
color: "#000"
}}
paddingTop="0em"
//icon={<Print/>}
>
<div>
<Card className="card">
<CardActionArea>
<CardMedia
style={{ height: 0, paddingTop: "100%" }}
image={card.image}
/>
<CardContent>
<Typography gutterBottom variant="h5" component="h2">
{card.title}
</Typography>
<Typography component="p">{card.subtitle}</Typography>
</CardContent>
</CardActionArea>
<Button
size="small"
color="primary"
component={Link}
//to={card.path}
onClick={this.handlePop}
>
Learn More, index : {i}, LEFT
</Button>
<Popover
open={this.state.popped}
anchorEl={this.state.anchorEl}
anchorOrigin={{
horizontal: "left",
vertical: "center "
}}
transformOrigin={{
horizontal: "left",
vertical: "bottom"
}}
onClose={this.handleRequestClose}
>
Left popover text
</Popover>
</Card>
</div>
</VerticalTimelineElement>
)}
</React.Fragment>
));
Here's a screen grab of the result.
您的弹出窗口都锚定到相同的元素 (this.state.anchorEl
),并且都配置为基于相同的布尔值 (this.state.popped
) 打开。这意味着如果您的时间轴中有 2 个以上的对象,您将为每个对象渲染一个弹出窗口,并且所有弹出窗口将一起打开或关闭,并且所有内容都将指向唯一锚元素的 left/right(无论是什么) .
您可能应该创建一个新的 TimelineObject
组件来呈现单个时间轴对象,并且可以拥有自己的本地状态并分配自己的本地 anchorEl
以将其弹出窗口锚定到。可能还有它自己的 popped
状态。那么您的地图功能将更像是:
timelineObjects.map((card, i) => <TimelineObject key={i} card={card} onLeft={i%2==0} />)
或者,不要将 this.state.popped
用作布尔值,而是将其用作卡片索引以显示弹出窗口。在你的 Popover
代码中做:
<Popover open={this.state.popped === i} ...
当您设置 popped
时,将其设置为 this.setState({popped: indexOfCardToShowPopover, anchorEl: elementOfCardToAnchorPopover });
这样一次只能打开 1 个弹出窗口。