Запустить модальный
Добро пожаловать обратно. Давайте продолжим создание нашего React-приложения в стиле Unsplash. Во время нашего последнего раунда мы успешно извлекли наши данные из Unsplash API, установили наше состояние с возвращенными результатами и визуализировали галерею из тридцати изображений при загрузке страницы.
Мы продолжим настройку onClick
функции, которая запускается, когда пользователь щелкает миниатюру, которая затем запускает модальное окно, отображающее полную версию изображения вместе с описанием. В функции constructor
нашего App
компонента, где мы инициализировали состояние, давайте добавим еще одно свойство с именем selectedImage
, например:
constructor(props) { super(props) this.state = { gallery: [], searchedQuery: '', selectedImage: { description: '', src: '', username: '', page: '', }, } }
Этот объект будет использоваться для получения всех данных, которые нам нужны для содержимого нашего модального окна. Давайте также настроим нашу launchModal
функцию в нашем App
компоненте.
launchModal = (index) => { this.setState((prevState) => { return { selectedImage: { description: prevState.gallery[index].description, src: prevState.gallery[index].urls.regular, username: prevState.gallery[index].user.username, page: prevState.gallery[index].user.links.html, } } }) }
Как видите, мы передадим index
, что будет выполнено в событии onClick
. Затем мы установим наше состояние асинхронно, передав prevState
и назначив свойства selectedImage
их соответствующим свойствам текущего элемента в prevState
gallery
с помощью index
. Обратите внимание, что на этот раз мы используем URL regular
для свойства src
, тогда как мы использовали свойство small
при настройке эскизов галереи нашей страницы. Теперь мы можем передать эту функцию в качестве опоры нашему компоненту Gallery
, а также нашему объекту selectedImage
следующим образом:
<Gallery gallery={this.state.gallery} launchModal={this.launchModal} selectedImage={this.state.selectedImage} />
Теперь перейдем к созданию модального всплывающего окна, когда пользователь выбирает изображение. Мы можем использовать Bootstrap для его модального окна (а затем для его навигационной панели и формы ввода для нашей функции поиска), установив его через npm или cdn. Мы также возьмем фрагмент модального шаблона из Bootstrap и вставим его в наш компонент Gallery
прямо под конечным тегом section
. Не забудьте изменить все атрибуты class
на className
, поскольку мы пишем JSX, а не HTML. Вам может не понадобиться div.modal-header
, если вы не хотите добавить заголовок в модальное окно. Не стесняйтесь настраивать модальное окно так или как хотите:
<div className="modal fade" id="selected-img-modal" tabIndex="-1" role="dialog" aria-labelledby="selected-img-modal-label" aria-hidden="true"> <div className="modal-dialog modal-lg" role="document"> <div className="modal-content"> <div className="modal-body"> <img src={selectedImage.src} alt={selectedImage.description} /> <hr/> <p>{selectedImage.description}</p> <p>Photo by <a href={selectedImage.page + `?utm_source=find-inspiration`} target="_blank" rel="noopener noreferrer">{selectedImage.username}</a> on <a href="https://unsplash.com/?utm_source=find-inspiration`" target="_blank" rel="noopener noreferrer">Unsplash</a></p> </div> </div> </div> </div>
Отлично, теперь у нас настроен модальный шаблон. У нас есть привязанные атрибуты src
и alt
тега img
, а также описание и кредит для фотографа и Unsplash, что не требуется в соответствии с их страницей лицензий, но это приятно. Теперь нам нужно принять нашу launchModal
функцию и настроить ее как событие щелчка для каждого эскиза. Наряду с деструктуризацией gallery
из нашего props
давайте также добавим launchModal
и selectedImage
. Нам также необходимо добавить некоторые атрибуты данных и прослушиватель событий onClick
в тег img
:
const Gallery = (props) => { const { gallery, launchModal, selectedImage } = props . . . <img src={image.urls.small} alt={image.description} data-toggle="modal" data-target="#selected-img-modal" onClick={() => launchModal(index)} /> . . . }
Отлично, теперь у вас должна быть возможность щелкнуть миниатюру, чтобы просмотреть версию изображения в увеличенном разрешении 😊
Далее добавление функции Search
…