#javascript #reactjs #semantic-ui
Вопрос:
Я хочу создать модал для своего приложения. Я перепробовал все, и мой closeicon не закроет мой модальный. Это прекрасно работает, когда я делаю модальный в том же файле, но я хочу сделать свой модальный как отдельный компонент. Что-то не так с моим кодом?
Родительский компонент:
import { Card, Placeholder, Image, Icon } from "semantic-ui-react";
import BookModal from "./BookModal";
import { useState } from "react";
const BookCard = props => {
const [showModal, setShowModal] = useState(false)
return (
<Card onClick={() => setShowModal(true)}>
<Image><Placeholder><Image src={props.image} size="large" /></Placeholder></Image>
<Card.Content>
<Card.Header>{props.title}</Card.Header>
<Card.Meta>
<span className='date'>{props.publishedDate}</span>
</Card.Meta>
<Card.Description>{props.author}</Card.Description>
</Card.Content>
<Card.Content extra>
<Icon name='star'>Rating</Icon>
</Card.Content>
<BookModal key="Modal1" open={showModal} onClose={() => setShowModal(false)}/>
</Card>
);
}
export default BookCard;
Модальный компонент для детей:
import { Modal } from "semantic-ui-react";
const BookModal = props => {
return (
<Modal
closeIcon
onClose={props.onClose}
open={props.open} >
<Modal.Header>
<h2>Modal content</h2>
</Modal.Header>
</Modal>
);
}
export default BookModal;
Комментарии:
1. Похоже на опечатку — в компоненте BookModal вы задаете
<Modal>
открытое состояниеprops.isOpen
, но в компоненте BookCard вы передаете ему свойство , называемоеopen
, а неisOpen
2. Исправлено, но все равно ничего, когда я утешаю. журнал ShowModal при нажатии кнопки Закрыть, он все время говорит правду
Ответ №1:
Вы столкнулись с интересной проблемой-когда вы нажимаете значок X, чтобы закрыть модальный, <Card>
компонент также получает этот щелчок!
Таким onClick
образом, обработчик в коде карты запускается при попытке закрыть модал и снова устанавливает состояние «открыто true
«. Это происходит после запуска onClose
обработчика в модале, поэтому модал останется открытым.
Вместо этого вы можете изменить код, чтобы открыть модальный по <Image>
щелчку:
<Card>
<Image
onClick={() => setShowModal(true)}
>
<Placeholder>
<Image src={props.image} size="large" />
</Placeholder>
</Image>
<Card.Content>
<Card.Header>{props.title}</Card.Header>
<Card.Meta>
<span className="date">{props.publishedDate}</span>
</Card.Meta>
<Card.Description>{props.author}</Card.Description>
</Card.Content>
<Card.Content extra>
<Icon name="star">Rating</Icon>
</Card.Content>
<BookModal
key="Modal1"
open={showModal}
onClose={() => setShowModal(false)}
/>
</Card>
Вы можете увидеть, как все это работает здесь: https://codesandbox.io/s/semantic-ui-example-forked-yy7p3?file=/BookCard.js
Поскольку <Image>
компонент является родным братом, а не родителем <BookModal>
компонента, щелчок не будет «проваливаться» или «всплывать» (какую бы семантику вы ни предпочитали) в него.
Другой способ-сохранить модальный триггер внутри модального. Вот как это делают их собственные примеры-вы можете найти упрощенный здесь: https://codesandbox.io/s/semantic-ui-example-forked-qo99z?file=/example.js