【发布时间】:2018-09-02 07:06:55
【问题描述】:
我的第一个 StackOverflow 问题,困扰了我大约 4 个小时!
我正在构建一个包含图片库部分的反应页面。在桌面站点上,当用户单击图像时,它会启动一个 Bootstrap 模式弹出窗口,其中应显示单击的绘画的详细信息(标题、大小、类型和媒体)和更大的图像。
我已经让模态框工作了(不需要像 react-bootstrap 这样的特殊库),但是无论单击哪个图像,模态框都只显示集合中第一张图像的图像和详细信息。
我尝试了各种 props 和 state 的排列,尝试了函数式和 class 组件,但似乎没有任何效果。
奇怪的是,如果我查看 chrome 开发工具 react DOM 中的每个组件,每个图像的道具都设置正确,即使在呈现模式的类中也是如此……但在实际呈现的页面中,它不起作用.
在我的代码中,我们有一个 Gallery 组件,包含许多 Holder 组件,每个 Holder 包含一个 PortfolioItem,而 PortfolioItem 包含一个名为 More 的组件,用于处理模态。由于每个 Holder 组件都定义了道具,因此这些道具会被传递给每个 PortfolioItem(当我在图库中获取正确的图像和细节时,它会起作用),我只希望这些相同的道具显示在模态中。
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'));
任何指针将不胜感激!
【问题讨论】:
-
不回答您的问题,而是对您的代码发表评论。不要在组件中使用组件状态,只需使用
this.props.,因为您不会在任何地方更改状态。 -
谢谢,是的,我最初确实是这样做的,我认为状态的使用只是我在尝试解决问题时尝试的东西。
标签: javascript reactjs ecmascript-6