В настоящее время я изучаю ReactJS, и я пытаюсь создать простой Лайтбокс. У меня есть три компонента: ThumbnailContainer, Thumbnail и Lightbox. Как показано ниже:ReactJS установка родительского состояния из дочернего состояния onClick handler
var ThumbnailContainer = React.createClass({
render: function(){
var thumbnails = this.props.thumbnail_data
var thumbnail_list = thumbnails.map(function(thumbnail){
console.log(thumbnail);
return <Thumbnail key={thumbnail.id} post={thumbnail}/>
});
return (
<div id="thumbnail-container">
{thumbnail_list}
</div>
);
}
});
var Thumbnail = React.createClass({
getInitialState: function(){
return {
display: false
};
},
openLightbox: function(e){
e.preventDefault();
this.setState({display: true});
},
closeLightbox: function(e){
this.setState({display: false});
},
render: function(){
var post = this.props.post;
return (
<div className="post" onClick={this.openLightbox}>
<img className="post-image" src={post.image} />
{ this.state.display ? <Lightbox image={post.image} closeHandler={this.closeLightbox}/> : null}
</div>
);
}
});
var Lightbox = React.createClass({
render: function(){
var image = this.props.image
return (
<div>
<div className="lightbox-background" onClick={this.props.closeHandler}></div>
<div className="lightbox-content" onClick={this.props.closeHandler}> <img src={image} /></div>
</div>
)
}
});
Открытие Lightbox работает нормально, но у меня возникли проблемы с установкой состояния на закрытии Lightbox. По какой-то причине this.setState фактически не устанавливает состояние в false, оно по-прежнему установлено в true после вызова setState.
Я что-то упустил? У меня есть скрипка с некоторыми примерами here
Спасибо за ответ! Я чувствую, что должен был знать это и как работает пузырение событий. Есть ли у вас предложения по улучшению этого? –
Если вы можете перевести с помощью Babel, вам может потребоваться использовать ES6, чтобы вы получили такие вещи, как 'const', чтобы ваши намерения были более четкими. Вы также можете посмотреть на новые функциональные компоненты без состояния, потому что (например) ваш класс 'Lightbox' будет соответствовать. – TwoStraws
Спасибо за подсказку! @TwoStraws Обязательно посмотрим на них. –