Я создаю приложение React, которое использует Semantic UI React. У меня есть несколько эскизов, которые открываются в модальном компоненте, чтобы показать полноразмерное изображение в модальном окне. У меня также есть кнопки для перехода к следующему и предыдущему. Наряду с нажатием кнопок я хотел бы использовать клавиши со стрелками для навигации. Я могу добавить слушателя событий в окно при открытии модального окна. Но когда я закрываю модальное окно и открываю другое, в окно добавляется дублирующий прослушиватель событий. Это означает, что мне нужно удалить прослушиватель событий, когда модальное окно закрыто. Однако свойства onClose и onUnmount модального компонента Semantic UI React не применяют удаление. Как я могу подать заявку? Все, кроме removeEventListener, может работать в onClose или onUnmount, но removeEventListener не запускается.
Вот весь компонент Attachment:
import React, { Fragment, useState } from 'react'
import { Button, Card, Modal, Image } from 'semantic-ui-react'
import parse from 'html-react-parser'
import { IMedia } from '../../app/models/media'
interface IProps {
attachedMedia: IMedia,
gallery: IMedia[],
featured: boolean
}
const Attachment: React.FC<IProps> = ({ attachedMedia, gallery, featured }) => {
const [open, setOpen] = useState(false)
const [index, setIndex] = useState(gallery.indexOf(attachedMedia))
const [disabledNext, setDisabledNext] = useState(false)
const [disabledPrev, setDisabledPrev] = useState(false)
const handlePrev = () => {
if (index > 0) {
setIndex(index - 1)
setDisabledNext(false)
if (index === 1) setDisabledPrev(true)
}
}
const handleNext = () => {
if (index < gallery.length - 1) {
setIndex(index + 1)
setDisabledPrev(false)
if (index === gallery.length - 2) setDisabledNext(true)
}
}
const handleClose = () => {
setIndex(gallery.indexOf(attachedMedia))
setDisabledPrev(false)
setDisabledNext(false)
setOpen(false)
window.removeEventListener('keydown', handleKeyPress)
}
const handleMount = () => {
if (index === 0) setDisabledPrev(true)
if (index === gallery.length - 1) setDisabledNext(true)
window.addEventListener('keydown', handleKeyPress)
}
const handleKeyPress = (e: KeyboardEvent) => {
console.log(e)
}
return (
<Fragment>
{featured ?
(attachedMedia.media_details.sizes.medium?.source_url !== undefined) ?
<Image src={attachedMedia.media_details.sizes.medium.source_url} ui={false} onClick={() => {setOpen(true)}} />
:
<Image src={attachedMedia.media_details.sizes.full.source_url} ui={false} onClick={() => {setOpen(true)}} />
:
<Card className="attachment"><Image src={attachedMedia.media_details.sizes.thumbnail.source_url} onClick={() => setOpen(true)} /></Card>
}
<Modal open={open} centered={false} onClose={handleClose} onMount={handleMount}>
<Modal.Header>
{parse(gallery[index].title.rendered)}
</Modal.Header>
<Modal.Content image scrolling>
<Image src={gallery[index].media_details.sizes.full.source_url} wrapped fluid />
<Modal.Description>
{parse(gallery[index].description.rendered)}
</Modal.Description>
</Modal.Content>
<Modal.Actions>
<Button disabled={disabledPrev} onClick={handlePrev}>Previous image</Button>
<Button disabled={disabledNext} onClick={handleNext}>Next image</Button>
</Modal.Actions>
</Modal>
</Fragment>
)
}
export default Attachment
Здесь функция handleClose содержит removeEventListener, но удаление не применяется к окну, несмотря на то, что остальная часть кода в handleClose может работать эффективно.
Единственное испытание, которое я смог запустить removeEventListener, заключалось в использовании его в функции handleKeyPress. Но это не то, что я хочу, он удаляет слушателя после одного нажатия клавиши. Я хочу иметь возможность нажимать клавиши, пока модальное окно открыто.
Как мне заставить removeEventListener действовать, когда модальное окно закрыто?