Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 29.10.2020, 00:35
Интересующийся
Отправить личное сообщение для dewembas Посмотреть профиль Найти все сообщения от dewembas
 
Регистрация: 20.07.2020
Сообщений: 16

React нужна помощь
Всем привет, мне нужна помощь, есть проект с постерами фильмов, пр нажатии на постер нужно что бы его бэкграунд был изображением постера, но я запутался, не могу понять как сделать что бы к конкретному постеру открывался тот же постер, они у меня открываются все по очереди как сделать открытие по индексу или что то подобное , буду очень благодарен за помощь.
Ссылка на репозиторий : https://github.com/Dewembas/React-moviees
Ответить с цитированием
  #2 (permalink)  
Старый 29.10.2020, 02:00
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,791

Научитесь форматировать свой код.

Как я понял речь о компоненте Movie.
У вас на каждый фильм рендерится по одной картинке и по изначально скрытому модальному окну.
Видимость всех модалок у вас зависит от одной переменной - «show».

Во-первых, имхо, на каждый элемент необязательно рендерить по модальному окно, можно обойтись вторым.
Во-вторых, при нажатии на любой постер фильма открываются сразу все модальные окна.

Сохраняйте в state не состояние модалки (открыт/закрыт), а индекс открытого окна.
Если у вас как и сейчас останется на каждый фильм по окну, то просто проверяете, что индекс текущего элемента равен "индексу открытого фильма".
Если оставите только одно окно, что правильнее, то просто проверяете, что у вас есть открытый элемент. В этом случае получить сам элемент можно по его известному индексу.
Ответить с цитированием
  #3 (permalink)  
Старый 29.10.2020, 02:06
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,791

Примерно так:

function Movies() {
    const [items, saveItems] = useState([]);
    const [openItemIndex, saveOpenItemIndex] = useState(null);
    
    return <>
        {items.map((item, index) => (
            <div>
                <img src={item.poster_src} onClick={() => saveOpenItemIndex(index)} />
            </div>
        ))}
        
        <Modal show={Boolean(openItemIndex)} />
    </>;
}
Ответить с цитированием
  #4 (permalink)  
Старый 30.10.2020, 11:34
Интересующийся
Отправить личное сообщение для dewembas Посмотреть профиль Найти все сообщения от dewembas
 
Регистрация: 20.07.2020
Сообщений: 16

Сообщение от Nexus Посмотреть сообщение
Научитесь форматировать свой код.

Как я понял речь о компоненте Movie.
У вас на каждый фильм рендерится по одной картинке и по изначально скрытому модальному окну.
Видимость всех модалок у вас зависит от одной переменной - «show».

Во-первых, имхо, на каждый элемент необязательно рендерить по модальному окно, можно обойтись вторым.
Во-вторых, при нажатии на любой постер фильма открываются сразу все модальные окна.

Сохраняйте в state не состояние модалки (открыт/закрыт), а индекс открытого окна.
Если у вас как и сейчас останется на каждый фильм по окну, то просто проверяете, что индекс текущего элемента равен "индексу открытого фильма".
Если оставите только одно окно, что правильнее, то просто проверяете, что у вас есть открытый элемент. В этом случае получить сам элемент можно по его известному индексу.
Подскажите пожалуйста еще , как сделать одно модальное окно? Как упоминалось выше
Ответить с цитированием
  #5 (permalink)  
Старый 30.10.2020, 13:05
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,791

Сообщение от dewembas
как сделать одно модальное окно?
https://javascript.ru/forum/library-...tml#post530177
Ответить с цитированием
  #6 (permalink)  
Старый 30.10.2020, 14:32
Интересующийся
Отправить личное сообщение для dewembas Посмотреть профиль Найти все сообщения от dewembas
 
Регистрация: 20.07.2020
Сообщений: 16

Сообщение от Nexus Посмотреть сообщение
https://javascript.ru/forum/library-...tml#post530177
Упс, спасибо
Ответить с цитированием
  #7 (permalink)  
Старый 31.10.2020, 00:59
Интересующийся
Отправить личное сообщение для dewembas Посмотреть профиль Найти все сообщения от dewembas
 
Регистрация: 20.07.2020
Сообщений: 16

Сообщение от Nexus Посмотреть сообщение
https://javascript.ru/forum/library-...tml#post530177
У меня опять вопрос не пойму , а как же сделать бэкграунд я уже вроде все попробовал он пишет undefined, что делать ?
Ответить с цитированием
  #8 (permalink)  
Старый 31.10.2020, 01:10
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,791

dewembas, сделайте макет вашей задачи в любой песочнице, без него непонятно где у вас undefined.
Ответить с цитированием
  #9 (permalink)  
Старый 31.10.2020, 02:31
Интересующийся
Отправить личное сообщение для dewembas Посмотреть профиль Найти все сообщения от dewembas
 
Регистрация: 20.07.2020
Сообщений: 16

Сообщение от Nexus Посмотреть сообщение
dewembas, сделайте макет вашей задачи в любой песочнице, без него непонятно где у вас undefined.
Не получается создать в песочнеце, фетч запрос не хочет обрабатываться
могу только вот скрин прислать где undefined
Изображения:
Тип файла: jpg photo_2020-10-31_01-30-47.jpg (189.1 Кб, 4 просмотров)
Ответить с цитированием
  #10 (permalink)  
Старый 31.10.2020, 14:10
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,791

dewembas, если ни вы, ни ваш редактор кода форматировать этот самый код не умеете, то можете воспользоваться этим ресурсом: https://prettier.io/playground

В моем примере константы items и saveItems были аналогом ваших переменных data и setData.
Что лежит в константе data без просмотра кода сказать сложно, там может быть что угодно, однако константа items наверняка хранит итерируймый объект и почти наверняка это массив.
Так что либо удалите мою версию, либо исправьте свою.

Ваши константы handleClose и handleShow можете удалить, они лишние как и show вместе с setShow.

39-я строка вашего неформатированного кода: лишний третий аргумент callback'а, переданного в метод map. Он, как я и написал, лишний, к тому же имеет название, которое вводит в заблуждение (useState). Если интересно, что передается третьим аргементом в метод map - смотрите тут.

В 40-й строке замените атрибут onClick на этот:
onClick={() => saveOpenItemIndex(index)}


50-я и 51-я строки должны быть такими:
show={!!openItemIndex}
onHide={() => saveOpenItemIndex(null)}


Строки 45 и 64 - лишние.

В 55-й строке вместо «data?.poster_path» должно быть «data[openItemIndex]?.poster_path».

Вы, похоже, совсем не пытаетесь вникнуть в то, что пишите.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужна помощь! surin.89 jQuery 72 23.12.2020 16:03
Нужна помощь по javascript darklend Общие вопросы Javascript 0 12.01.2014 23:33
Нужна помощь: Slider wheel Alex555 Мобильный JavaScript 0 15.05.2013 18:06
Нужна помощь по слайдеру seoguru Работа 3 28.01.2013 22:02
нужна помощь dominosoko Серверные языки и технологии 4 14.03.2010 02:17