【问题标题】:How to make popup in a loop in React?如何在 React 中循环弹出?
【发布时间】:2019-01-02 09:29:14
【问题描述】:

我正在尝试在 React 中循环弹出窗口,但我不知道如何只打开一个触发元素。

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 改变状态如下:

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

【问题讨论】:

  • 也许将视频对象保存在一个数组中,然后在map函数中获取每个视频的索引,并用它来改变相关视频的videoPopup?

标签: javascript reactjs loops popup


【解决方案1】:

在状态中存储一个不会自动选择的虚假初始视频索引(null,未定义)。创建一个接受视频索引作为参数的点击处理程序,然后将其设置为状态。在渲染函数中使用 this.state.videoIndex 的事实来测试它是否等于当前正在渲染的视频 div 并相应地设置其属性。

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

【讨论】:

  • 它帮助了我,但我有一些问题。我无法关闭此弹出窗口。我的意思是这个地图中的函数不会改变状态。除此之外,当我将视频从一个更改为另一个时,第一个视频并没有停止。你有什么办法修复它吗?
  • 已更新,立即查看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-11
  • 1970-01-01
  • 2020-10-15
  • 1970-01-01
  • 2014-04-11
  • 2014-05-14
相关资源
最近更新 更多