reactjs 如何在React中将相同的模态组件呈现到列表数组itens中?

7bsow1i6  于 2023-01-08  发布在  React
关注(0)|答案(1)|浏览(101)

我需要将一个modal/lightbox组件动态地呈现到一个列表数组组件中,但是它只呈现了最后一个modal内容。
我如何将这个模态组件动态化,以便从主组件调用它,并使用对象数组中的正确数据填充它?
我的列表组件为:

import React, { Component } from 'react';
import LightBox from './LightBox';

class ListPrice extends Component {

  constructor(props) {
    super(props);
    this.state = { isOpen: false };
  }

  toggleModal = () => {
    this.setState({
      isOpen: !this.state.isOpen
    });
  }

   render() {
     return (
       <div>
        {this.props.products.map(product => {
         return(
          <div>
          <a key={product.id} onClick={this.toggleModal}>
              <h3>{product.title}</h3>
              <p>{product.description}</p>
           </a>
          <LightBox key={product.id} show={this.state.isOpen}
                    onClose={this.toggleModal}>
                    {product.modalContent}
          </LightBox>
        </div>
      );
    })}
   </div>
  );
 }
}
export default ListPrice;

我的LightBox组件是(我删除了样式以显示短代码):

import React from 'react';
import PropTypes from 'prop-types';

class LightBox extends React.Component {
  render() {
    if(!this.props.show) {
      return null;
    }
    return (
      <div>
        <div>
          {this.props.children}
          <div>
            <button onClick={this.props.onClose}>
              Close
            </button>
          </div>
        </div>
      </div>
    );
  }
}

LightBox.propTypes = {
  onClose: PropTypes.func.isRequired,
  show: PropTypes.bool,
  children: PropTypes.node
};

export default LightBox;

感谢您的评分

8hhllhi2

8hhllhi21#

使用show={this.state.isOpen},您总是显示所有的模态-只有最后一个模态是可见的,因为其他模态显示在它后面。
为了解决这个问题,你必须只显示选中的对话框。你可以用this.setState({ openedDialog: product.id })这样的结构来存储打开的对话框。
然后,您可以使用this.state.openedDialog === product.id查询对话框是否打开,这样就可以完成任务了。

openModal = (id) = () => {
  this.setState({
    openedDialog: id
  });
}

closeModal = () => {
  this.setState({
    openedDialog: null
  });
}

show={this.state.openedDialog === product.id}
onClick={this.openModal(product.id)}
onClose={this.closeModal}

相关问题