React - Прокрутите массив объектов и выделите выбранный элемент onClick

У меня есть массив объектов, содержащий данные, которые я выводил в DOM с помощью карты. Каждый элемент в списке имеет прослушиватель событий onClick. Когда вы нажимаете на один из элементов, я хочу, чтобы он выделялся путем добавления класса css, например «hover». Так что в основном это должно работать как система меню. Когда вы нажимаете на элемент, этот элемент выделяется, а другие выделяться не должны, и наоборот.

Так, как я настроил прямо сейчас, все элементы в списке выделяются, что не является той логикой, которую я пытаюсь сделать. Я использовал console.info, чтобы показать, какой элемент был нажат. Однако я до сих пор не понял, как сделать этот выбранный элемент тем, который выделен, а не весь список?

import React, { Component } from 'react';

class MenuSelector extends Component {
    state = {
        active: false,
        menu: [
            {
                id: 1,
                fighterName: 'Goku',
                race: 'Sayian',
                specialAttack: 'Kamehameha Wave',
                img: 'https://nerdist.com/wp-content/uploads/2018/01/Dragon-Ball-Super-Goku.jpg'
            },
            {
                id: 2,
                fighterName: 'Vegeta',
                race: 'Sayian',
                specialAttack: 'Final Flash',
                img: 'https://imgmr.com/wp-content/uploads/2016/04/Vegeta-SSGSS-2.png'
            },
            {
                id: 3,
                fighterName: 'Gohun',
                race: 'Human',
                specialAttack: 'Masenko',
                img: 'https://techanimate.com/wp-content/uploads/2017/11/Why-does-Gohan-Have-so-much-Hidden-Power-1024x576.jpg'
            },
            {
                id: 4,
                fighterName: 'Krillin',
                race: 'Human',
                specialAttack: 'Destructo Disc',
                img: 'https://static3.srcdn.com/wordpress/wp-content/uploads/2016/09/Krillin-Destructo-Disk.jpg'
            },
            {
                id: 5,
                fighterName: 'Android 17',
                race: 'Android',
                specialAttack: 'Barrier',
                img: 'https://i.ytimg.com/vi/SzAiIy_Dnb4/maxresdefault.jpg'
            },
            {
                id: 6,
                fighterName: 'Jiren',
                race: 'Unknown',
                specialAttack: 'Eye Paralysis',
                img: 'https://vignette.wikia.nocookie.net/dragonuniverse/images/9/9c/Jiren.png/revision/latest/scale-to-width-down/2000?cb=20180211002429'
            },
            {
                id: 7,
                fighterName: 'Lord Beerus',
                race: 'God',
                specialAttack: 'Hakai',
                img: 'https://vignette.wikia.nocookie.net/dragonuniverse/images/3/30/Beerus2.png/revision/latest?cb=20170225064338'
            },
            {
                id: 8,
                fighterName: 'Cell',
                race: 'Android',
                specialAttack: 'Kamehameha Wave',
                img: 'https://static0.srcdn.com/wordpress/wp-content/uploads/Dragon-Ball-Z-Perfect-Cell.jpg'
            },
            {
                id: 9,
                fighterName: 'Frieza',
                race: 'Unknown',
                specialAttack: 'Finger Blasters',
                img: 'https://i.ytimg.com/vi/BkoOw_7JqKg/maxresdefault.jpg'
            },
            {
                id: 10,
                fighterName: 'Black Goku',
                race: 'Sayian',
                specialAttack: 'Ki Blade',
                img: 'https://pm1.narvii.com/6287/eafbdf4dc0ae1b58d3869b89be04bcd0712f7623_hq.jpg'
            },
        ]
    }
    toggleClass = (id) => {
        console.info(`Clicked item ${id}`, this);

        const currentState = this.state.active;
        this.setState({ active: !currentState });
    };

    selectHandler = (id) => {
        console.info(`Clicked item ${id}`);
        console.info(this);

    }

  render() {
    return (
      <div className = "container">
        <h1>Menu Selector</h1>
        <div>
        <ul>
            {this.state.menu.map((dragonball, index) => (
                <li key = {index} onClick = {() => this.toggleClass(dragonball.id)} className = {this.state.active ? 'hover': null}>
                <div className = "container-dragonball">
                <div className = "dragonball-stats">
                <h1>{dragonball.fighterName}</h1>
                <p>Race: {dragonball.race}</p>
                <p>Special Attack: {dragonball.specialAttack}</p>
                </div>
                <div className = "dragonball-img"><img src = {dragonball.img} alt = {dragonball.fighterName} /></div>
                </div>
                </li>
            ))}
            </ul>
        </div>
      </div>
    );
  }
}

export default MenuSelector;
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
1 362
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Обновлен toggleClass, чтобы добавить selected item id в состояние.

toggleClass = (id) => {

        this.setState({ selectedItemIndex: id });
    };

Сейчас, модифицированный li с

className = {this.state.selectedItemIndex== dragonball.id? 'hover': null}.

Зациклите menu и проверьте наличие selected item id. Добавьте требуемый класс, если есть соответствие для id

    <li key = {index} onClick = {() => this.toggleClass(dragonball.id)} 
className = {this.state.selectedItemIndex== dragonball.id? 'hover': null}>

Спасибо, решение, которое вы предоставили, сработало. Только одно. Я думаю, это должно быть «===» вместо «==». Когда я выполнил это, это было помечено как ошибка. Таким образом, приведенный ниже измененный код, вероятно, более идеален. <li key = {index} onClick = {() => this.toggleClass (dragonball.id)} className = {this.state.selectedItemIndex === dragonball.id? 'hover': null}>

Andrew Baisden 24.05.2018 13:20

Извините, мой плохой. === лучше, но убедитесь, что ответ соответствует типу данных для него

RIYAJ KHAN 24.05.2018 13:29

@AndrewBaisden, если он работает нормально, примите его и проголосуйте за него.

RIYAJ KHAN 24.05.2018 16:28

Таким образом вы можете выбрать несколько

 handleSelect = ( id) => {
    const selection = this.state.selected
    if (this.state.selected[id] == 1) {
      selection[id] = 0 //deselect the item
    } else selection[id] = 1 //select the item
    this.setState({ selected: selection }, () =>
      console.info(this.state.selected)
    )
  }

затем добавьте свой className вот так

<li className = { ` ${this.state.selected[dragonball.id] == 1 && "selected"}` }>

Другие вопросы по теме