我的第一个 StackOverflow 问题,已经让我头疼了大约 4 个小时!
我正在构建一个包含图片库部分的 React 页面。在桌面站点上,当用户单击图像时,它会启动一个 Bootstrap 模式弹出窗口,该弹出窗口应显示单击的绘画的详细信息(标题、大小、类型和媒体)和更大的图像。
我已经让模态工作(不需要任何像 react-bootstrap 这样的特殊库)但是无论点击哪个图像,模态只显示图像和集合中第一张图像的细节。
我尝试了 props 和 state 的各种排列,尝试了函数和类组件,但似乎没有任何效果。
奇怪的是,如果我查看 chrome 开发工具 react DOM 中的每个组件,每个图像的props都设置正确,即使在呈现模态的类中也是如此……但在实际呈现的页面中,它不起作用。
在我的代码中,我们有一个 Gallery 组件,包含许多 Holder 组件,每个 Holder 包含一个 PortfolioItem,而 PortfolioItem 包含一个名为 More 的组件,用于处理模态。当每个 Holder 组件定义props时,这些props会传递给每个 PortfolioItem(当我在图库中获得正确的图像和细节时,它会起作用),我只希望这些相同的props显示在模态中。
import React from 'react';
import ReactDOM from 'react-dom';
class PortfolioItem extends React.Component {
constructor(props) {
super(props);
this.state = {
url: props.url,
title: props.title,
type: props.type,
size: props.size,
media: props.media
};
}
render() {
return (
<div className="ot-portfolio-item">
<More url={this.state.url} title={this.state.title} type={this.state.type} size={this.state.size}
media={this.state.media}/>
<figure className="effect-border">
<img src={this.state.url} className="img-responsive portfolio-img" alt={this.state.title}/>
<figcaption>
<h2 className="paintingTitle">{this.state.title}</h2>
<p className="paintingDetail">{this.state.type}, {this.state.size}, {this.state.media}</p>
<a data-toggle="modal" data-target="#Modal"> </a>
</figcaption>
</figure>
</div>
);
}
}
class More extends React.Component {
constructor(props) {
super(props);
this.state = {
url: props.url,
title: props.title,
type: props.type,
size: props.size,
media: props.media
};
}
render() {
return (
<div className="modal fade" id="Modal" aria-labelledby="Modal-label">
<div className="modal-dialog">
<div className="modal-content">
<div className="modal-header">
<button type="button" className="close" data-dismiss="modal" aria-label="Close"><span
aria-hidden="true">×</span></button>
<h4 className="modal-title">{this.state.title}</h4>
</div>
<div className="modal-body">
<img src={this.state.url} alt={this.state.title} className="img-responsive"/>
<div className="modal-works">
<span>{this.state.type}</span>
<span>{this.state.size}</span>
<span>{this.state.media}</span>
</div>
</div>
<div className="modal-footer">
<button type="button" className="close btn btn-default" data-dismiss="modal"
aria-label="Close">Close
</button>
</div>
</div>
</div>
</div>
);
}
}
const Holder = (props) => {
return (
<div className="col-sm-6 col-md-4 col-0-gutter holder">
<PortfolioItem url={props.url} title={props.title} type={props.type} size={props.size} media={props.media}/>
</div>
);
};
const Gallery = () => {
return (
// When adding a new painting, just copy a <Holder/> in correct orientation section, and change the props!
<div>
{/* Landscape */}
<Holder url="https://dgtqqzvj8521c.cloudfront.net/girl.jpg" title="#Disengaged" type="Acrylic"
size="24 by 16 inches" media="Board"/>
<Holder url="https://dgtqqzvj8521c.cloudfront.net/swimming.jpg" title="Submerge" type="Acrylic"
size="24 by 16 inches" media="Canvas"/>
<Holder url="https://dgtqqzvj8521c.cloudfront.net/staithes.jpg" title="Staithes 2015" type="Acrylic"
size="24 by 16 inches" media="Canvas"/>
<Holder url="https://dgtqqzvj8521c.cloudfront.net/ladies.jpg" title="Nederlandes Meisjes" type="Acrylic"
size="24 by 16 inches" media="Canvas"/>
<Holder url="https://dgtqqzvj8521c.cloudfront.net/park.jpg" title="Family Stroll" type="Acrylic"
size="24 by 16 inches" media="Canvas"/>
<Holder url="https://dgtqqzvj8521c.cloudfront.net/mexican.jpg" title="Tree Of Life" type="Acrylic"
size="12 by 10 inches" media="Canvas"/>
{/* Square */}
<Holder url="https://dgtqqzvj8521c.cloudfront.net/face.jpg" title="Attitudes Of Colour" type="Acrylic"
size="19.5 by 19.5 inches" media="Board"/>
<Holder url="https://dgtqqzvj8521c.cloudfront.net/lee.jpg" title="Lee" type="Acrylic"
size="19.5 by 19.5 inches" media="Canvas"/>
<Holder url="https://dgtqqzvj8521c.cloudfront.net/boat.jpg" title="Drift Away" type="Acrylic"
size="12 by 12 inches" media="Board"/>
<Holder url="https://dgtqqzvj8521c.cloudfront.net/cindyself.jpg" title="Prizeworthy" type="Acrylic"
size="19.5 by 19.5 inches" media="Canvas"/>
{/* Portrait */}
<Holder url="https://dgtqqzvj8521c.cloudfront.net/diving.jpg" title="Ascent" type="Acrylic"
size="32 by 40 inches" media="Ply"/>
<Holder url="https://dgtqqzvj8521c.cloudfront.net/bluehair.jpg" title="Untitled" type="Acrylic"
size="10 by 12 inches" media="Canvas"/>
<Holder url="https://dgtqqzvj8521c.cloudfront.net/beach.jpg" title="Namaste" type="Acrylic"
size="19.5 by 23.5 inches" media="Canvas"/>
<Holder url="https://dgtqqzvj8521c.cloudfront.net/danielle.jpg" title="Concrete Jungle" type="Acrylic"
size="19.5 by 23.5 inches" media="Canvas"/>
<Holder url="https://dgtqqzvj8521c.cloudfront.net/africa.jpg" title="Untitled" type="Acrylic"
size="19.5 by 23.5 inches" media="Canvas"/>
<Holder url="https://dgtqqzvj8521c.cloudfront.net/sealady.jpg" title="Aqua Blue" type="Acrylic"
size="32 by 40 inches" media="Canvas"/>
<Holder url="https://dgtqqzvj8521c.cloudfront.net/violinman.jpg" title="Nightfall" type="Acrylic"
size="11 by 14 inches" media="Canvas"/>
<Holder url="https://dgtqqzvj8521c.cloudfront.net/indiangirl.jpg" title="Transition" type="Acrylic"
size="19.5 by 23 inches" media="Canvas"/>
<Holder url="https://dgtqqzvj8521c.cloudfront.net/indianboys.jpg" title="Backpacker's Tales" type="Acrylic"
size="32 by 40 inches" media="Canvas"/>
<Holder url="https://dgtqqzvj8521c.cloudfront.net/indianwoman.jpg" title="Journey" type="Acrylic"
size="19.5 by 23.5 inches" media="Board"/>
</div>
);
};
const App = () => {
return (
<Gallery/>
);
};
ReactDOM.render(<App/>, document.getElementById('root'));
任何指针将不胜感激!