How to make popup in a loop in React?












0















I'm trying to make popup in a loop in React, but I don't know how to open only one triggered element.



this.props.Videos.map((video) => {
return (
<div onClick={this.onClick}>
<img src="https://blog.xenproject.org/wp-content/uploads/2014/10/Testing.jpg" alt=""/>
<h3>Text</h3>
<div style={{display: this.state.videoPopup === true ? "block" : "none"}}>
<video data-setup='{ "techOrder": ["youtube"], "sources": [{ "type": "video/youtube", "src": ""}] }'
className="video-js vjs-default-skin"
controls>
</video>
</div>
</div>
);
})) : null


OnClick changes state like this:



    this.setState({
videoPopup: !this.state.videoPopup
});









share|improve this question


















  • 1





    Maybe save video objects in an array in state, then get the index of each video in the map function and use it to change the videoPopup for the relevant video?

    – Sagi Rika
    Jan 2 at 9:32
















0















I'm trying to make popup in a loop in React, but I don't know how to open only one triggered element.



this.props.Videos.map((video) => {
return (
<div onClick={this.onClick}>
<img src="https://blog.xenproject.org/wp-content/uploads/2014/10/Testing.jpg" alt=""/>
<h3>Text</h3>
<div style={{display: this.state.videoPopup === true ? "block" : "none"}}>
<video data-setup='{ "techOrder": ["youtube"], "sources": [{ "type": "video/youtube", "src": ""}] }'
className="video-js vjs-default-skin"
controls>
</video>
</div>
</div>
);
})) : null


OnClick changes state like this:



    this.setState({
videoPopup: !this.state.videoPopup
});









share|improve this question


















  • 1





    Maybe save video objects in an array in state, then get the index of each video in the map function and use it to change the videoPopup for the relevant video?

    – Sagi Rika
    Jan 2 at 9:32














0












0








0








I'm trying to make popup in a loop in React, but I don't know how to open only one triggered element.



this.props.Videos.map((video) => {
return (
<div onClick={this.onClick}>
<img src="https://blog.xenproject.org/wp-content/uploads/2014/10/Testing.jpg" alt=""/>
<h3>Text</h3>
<div style={{display: this.state.videoPopup === true ? "block" : "none"}}>
<video data-setup='{ "techOrder": ["youtube"], "sources": [{ "type": "video/youtube", "src": ""}] }'
className="video-js vjs-default-skin"
controls>
</video>
</div>
</div>
);
})) : null


OnClick changes state like this:



    this.setState({
videoPopup: !this.state.videoPopup
});









share|improve this question














I'm trying to make popup in a loop in React, but I don't know how to open only one triggered element.



this.props.Videos.map((video) => {
return (
<div onClick={this.onClick}>
<img src="https://blog.xenproject.org/wp-content/uploads/2014/10/Testing.jpg" alt=""/>
<h3>Text</h3>
<div style={{display: this.state.videoPopup === true ? "block" : "none"}}>
<video data-setup='{ "techOrder": ["youtube"], "sources": [{ "type": "video/youtube", "src": ""}] }'
className="video-js vjs-default-skin"
controls>
</video>
</div>
</div>
);
})) : null


OnClick changes state like this:



    this.setState({
videoPopup: !this.state.videoPopup
});






javascript reactjs loops popup






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Jan 2 at 9:29









JamesJames

31




31








  • 1





    Maybe save video objects in an array in state, then get the index of each video in the map function and use it to change the videoPopup for the relevant video?

    – Sagi Rika
    Jan 2 at 9:32














  • 1





    Maybe save video objects in an array in state, then get the index of each video in the map function and use it to change the videoPopup for the relevant video?

    – Sagi Rika
    Jan 2 at 9:32








1




1





Maybe save video objects in an array in state, then get the index of each video in the map function and use it to change the videoPopup for the relevant video?

– Sagi Rika
Jan 2 at 9:32





Maybe save video objects in an array in state, then get the index of each video in the map function and use it to change the videoPopup for the relevant video?

– Sagi Rika
Jan 2 at 9:32












1 Answer
1






active

oldest

votes


















1














Store in state a falsey initial video index that won't automatically be selected (null, undefined). Create a click handler that accepts a video index as a parameter and then set that to state. In the render function use the fact that you have this.state.videoIndex to test if it equals the currently being rendered video div and set its attribute accordingly.



constructor(props) {
super(props);
this.state = {
videoIndex: null, // falsey value
}
}

videoClickHandler = index => this.setState(prevState => ({ videoIndex: prevState.videoIndex ? null : index})); // if truthy videoIndex, set null, else, set index

this.props.Videos.map((video, index) => {
return (
<div onClick={() => this.videoClickHandler(index)}> // pass index to callback
...
<div style={{display: this.state.videoIndex === index ? "block" : "none"}}> // test if state value equals current index
...
</div>
);
})) : null





share|improve this answer


























  • It helped me, but I have some issues. I can't close this popup. I mean that function inside this map doesn't change state. Apart from that when I change video from one to another, first video isn't stopping. Do you have any ideas how to repair that?

    – James
    Jan 2 at 14:49













  • Updated, check now.

    – Drew Reese
    Jan 2 at 15:44











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54003932%2fhow-to-make-popup-in-a-loop-in-react%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























1 Answer
1






active

oldest

votes








1 Answer
1






active

oldest

votes









active

oldest

votes






active

oldest

votes









1














Store in state a falsey initial video index that won't automatically be selected (null, undefined). Create a click handler that accepts a video index as a parameter and then set that to state. In the render function use the fact that you have this.state.videoIndex to test if it equals the currently being rendered video div and set its attribute accordingly.



constructor(props) {
super(props);
this.state = {
videoIndex: null, // falsey value
}
}

videoClickHandler = index => this.setState(prevState => ({ videoIndex: prevState.videoIndex ? null : index})); // if truthy videoIndex, set null, else, set index

this.props.Videos.map((video, index) => {
return (
<div onClick={() => this.videoClickHandler(index)}> // pass index to callback
...
<div style={{display: this.state.videoIndex === index ? "block" : "none"}}> // test if state value equals current index
...
</div>
);
})) : null





share|improve this answer


























  • It helped me, but I have some issues. I can't close this popup. I mean that function inside this map doesn't change state. Apart from that when I change video from one to another, first video isn't stopping. Do you have any ideas how to repair that?

    – James
    Jan 2 at 14:49













  • Updated, check now.

    – Drew Reese
    Jan 2 at 15:44
















1














Store in state a falsey initial video index that won't automatically be selected (null, undefined). Create a click handler that accepts a video index as a parameter and then set that to state. In the render function use the fact that you have this.state.videoIndex to test if it equals the currently being rendered video div and set its attribute accordingly.



constructor(props) {
super(props);
this.state = {
videoIndex: null, // falsey value
}
}

videoClickHandler = index => this.setState(prevState => ({ videoIndex: prevState.videoIndex ? null : index})); // if truthy videoIndex, set null, else, set index

this.props.Videos.map((video, index) => {
return (
<div onClick={() => this.videoClickHandler(index)}> // pass index to callback
...
<div style={{display: this.state.videoIndex === index ? "block" : "none"}}> // test if state value equals current index
...
</div>
);
})) : null





share|improve this answer


























  • It helped me, but I have some issues. I can't close this popup. I mean that function inside this map doesn't change state. Apart from that when I change video from one to another, first video isn't stopping. Do you have any ideas how to repair that?

    – James
    Jan 2 at 14:49













  • Updated, check now.

    – Drew Reese
    Jan 2 at 15:44














1












1








1







Store in state a falsey initial video index that won't automatically be selected (null, undefined). Create a click handler that accepts a video index as a parameter and then set that to state. In the render function use the fact that you have this.state.videoIndex to test if it equals the currently being rendered video div and set its attribute accordingly.



constructor(props) {
super(props);
this.state = {
videoIndex: null, // falsey value
}
}

videoClickHandler = index => this.setState(prevState => ({ videoIndex: prevState.videoIndex ? null : index})); // if truthy videoIndex, set null, else, set index

this.props.Videos.map((video, index) => {
return (
<div onClick={() => this.videoClickHandler(index)}> // pass index to callback
...
<div style={{display: this.state.videoIndex === index ? "block" : "none"}}> // test if state value equals current index
...
</div>
);
})) : null





share|improve this answer















Store in state a falsey initial video index that won't automatically be selected (null, undefined). Create a click handler that accepts a video index as a parameter and then set that to state. In the render function use the fact that you have this.state.videoIndex to test if it equals the currently being rendered video div and set its attribute accordingly.



constructor(props) {
super(props);
this.state = {
videoIndex: null, // falsey value
}
}

videoClickHandler = index => this.setState(prevState => ({ videoIndex: prevState.videoIndex ? null : index})); // if truthy videoIndex, set null, else, set index

this.props.Videos.map((video, index) => {
return (
<div onClick={() => this.videoClickHandler(index)}> // pass index to callback
...
<div style={{display: this.state.videoIndex === index ? "block" : "none"}}> // test if state value equals current index
...
</div>
);
})) : null






share|improve this answer














share|improve this answer



share|improve this answer








edited Jan 2 at 16:08

























answered Jan 2 at 9:48









Drew ReeseDrew Reese

970211




970211













  • It helped me, but I have some issues. I can't close this popup. I mean that function inside this map doesn't change state. Apart from that when I change video from one to another, first video isn't stopping. Do you have any ideas how to repair that?

    – James
    Jan 2 at 14:49













  • Updated, check now.

    – Drew Reese
    Jan 2 at 15:44



















  • It helped me, but I have some issues. I can't close this popup. I mean that function inside this map doesn't change state. Apart from that when I change video from one to another, first video isn't stopping. Do you have any ideas how to repair that?

    – James
    Jan 2 at 14:49













  • Updated, check now.

    – Drew Reese
    Jan 2 at 15:44

















It helped me, but I have some issues. I can't close this popup. I mean that function inside this map doesn't change state. Apart from that when I change video from one to another, first video isn't stopping. Do you have any ideas how to repair that?

– James
Jan 2 at 14:49







It helped me, but I have some issues. I can't close this popup. I mean that function inside this map doesn't change state. Apart from that when I change video from one to another, first video isn't stopping. Do you have any ideas how to repair that?

– James
Jan 2 at 14:49















Updated, check now.

– Drew Reese
Jan 2 at 15:44





Updated, check now.

– Drew Reese
Jan 2 at 15:44




















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54003932%2fhow-to-make-popup-in-a-loop-in-react%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

MongoDB - Not Authorized To Execute Command

How to fix TextFormField cause rebuild widget in Flutter

Npm cannot find a required file even through it is in the searched directory