麻烦映射反应模式

问题描述 投票:0回答:1

我能够将数据从json文件映射到卡片,并且在卡片页脚中有一个按钮可以切换模式,但是我一直得到相同的模式。经过研究后,我发现您无法映射模态,因为最终生成了所有模态,并且显示了最后一个模态。我只是不知道该怎么做,所以我只能得到正确的。

import projects from '../../projects.json';

const Portfolio = () => {
  const [modal, setModal] = useState(false);
  const toggle = () => setModal(!modal);
  return (
    <section id='portfolio'>
      <Container>
        <Row>
          {projects.map(project => (
            <Col lg='4' sm='6' key={project.id}>
              <div>
                <Card className='text-center mb-2'>
                  <CardImg
                    top
                    height='100%'
                    width='100%'
                    src={require('../../img' + project.image)}
                    alt={project.title}
                  />
                  <CardBody>
                    <CardTitle>{project.title}</CardTitle>
                    <CardText>{project.description}</CardText>
                    <Row className='justify-content-center'>
                      <Button color='info' onClick={() => toggle(project.id)}>
                        My Resume
                      </Button>
                      <Modal isOpen={modal} toggle={toggle} size='lg'>
                        <ModalBody size='lg'>
                          <img
                            className='img-fluid'
                            style={{
                              width: '100%',
                              height: '100%'
                            }}
                            title='resume'
                            alt={project.title}
                            src={require('../../img' + project.image)}
                          />
                          <p>{project.description}</p>
                        </ModalBody>
                        <ModalFooter>
                          <Button
                            color='info'
                            className='mr-2 d-flex align-items-center'
                            href={project.href}
                            target='_blank'
                            rel='noopener noreferrer'
                          >
                            Check it out
                          </Button>
                          <a
                            className='d-block'
                            href={project.github}
                            target='_blank'
                            rel='noopener noreferrer'
                          >
                            <i className='fab fa-github fa-3x text-muted'></i>
                          </a>
                          <Button
                            color='secondary'
                            className='btn btn-primary btn-xl bg-info'
                            size='sm'
                            onClick={toggle}
                          >
                            Close
                          </Button>
                        </ModalFooter>
                      </Modal>
                    </Row>
                  </CardBody>
                </Card>
              </div>
            </Col>
          ))}
        </Row>
      </Container>
    </section>
  );
};
reactjs modal-dialog mapping react-hooks reactstrap
1个回答
0
投票

我实际上能够弄清楚。我最终使用了json文件中的ID来切换正确的模式。

import React, { useState } from 'react';
import {
  Card,
  Container,
  Col,
  Row,
  CardBody,
  CardTitle,
  CardText,
  CardImg,
  Button,
  Modal,
  ModalBody,
  ModalFooter
} from 'reactstrap';
import projects from '../../projects.json';

const Portfolio = () => {
  const [modal, setModal] = useState(false);
  const toggle = project => setModal(project.id);

  return (
    <section id='portfolio'>
      <Container>
        <Row>
          {projects.map(project => (
            <Col lg='4' sm='6' key={project.id}>
              <div>
                <Card className='text-center mb-2'>
                  <CardImg
                    top
                    height='100%'
                    width='100%'
                    src={require('../../img' + project.image)}
                    alt={project.title}
                  />
                  <CardBody>
                    <CardTitle>{project.title}</CardTitle>
                    <CardText className='text-muted'>
                      {project.description}
                    </CardText>
                    <Row className='justify-content-center'>
                      <Button color='info' onClick={() => toggle(project)}>
                        More Info
                      </Button>
                      <Modal
                        isOpen={modal === project.id}
                        toggle={toggle}
                        size='xl'
                      >
                        <ModalBody size='lg'>
                          <CardImg
                            className='img-fluid'
                            size='xl'
                            style={{
                              width: '100%',
                              height: '100%'
                            }}
                            title='resume'
                            alt={project.title}
                            src={require('../../img' + project.image)}
                          />
                          <p className='mt-4'>{project.description}</p>
                        </ModalBody>
                        <ModalFooter>
                          <Button
                            color='info'
                            className='mr-2 d-flex '
                            href={project.href}
                            target='_blank'
                            rel='noopener noreferrer'
                          >
                            Check it out
                          </Button>
                          <a
                            className='d-block mr-2'
                            href={project.github}
                            target='_blank'
                            rel='noopener noreferrer'
                          >
                            <i className='fab fa-github fa-3x text-muted'></i>
                          </a>
                          <Button
                            color='danger'
                            className='btn btn-primary btn-xl'
                            size='md'
                            onClick={toggle}
                          >
                            Close
                          </Button>
                        </ModalFooter>
                      </Modal>
                    </Row>
                  </CardBody>
                </Card>
              </div>
            </Col>
          ))}
        </Row>
      </Container>
    </section>
  );
};

export default Portfolio;
© www.soinside.com 2019 - 2024. All rights reserved.