TransWikia.com

Обработка клика по элементу массива

Stack Overflow на русском Asked on December 9, 2021

Подскажите, пожалуйста, как добавлять/удалять класс при клике кнопку?

Дан массив объектов, при клике на кнопку к элементу должен добавляться класс active, при повторном клике этот класс должен убираться.
Пробовал через useState, но так класс добавляется ко всем элементам.

Также пробовал через ref, но почему то через classList.add('active') не происходит добавление ?‍♂️

Код:

import React from 'react'

function Card({ items }) {

  const onSelectItem = (item) => {
    ...?
  }

  return items.map((e, i) => {
    return (
      <div key={`${e.id + i}_${i}`} className="card">
          <div className="card__controls">
            <div
              className="card__fav button button--shadow"
              onClick={() => onSelectItem(e)}>
              <svg>...</svg>
            </div>
          </div>
      </div>
    )
  })
}

export default Card

One Answer

Вы можете хранить состояние в самом массиве для каждого элемента:

import React from 'react'

function Card({ items, setItems }) {

 // вместо индекса лучше использовать уникальный ключ каждого элемента, если есть
  const onSelectItem = (item, index) => {
    setItems(items.map((v, idx)=>index===idx ? {...v, isActive: true} : v ))
  }

  return items.map((e, i) => {
    return (
      <div key={`${e.id + i}_${i}`} className="card">
          <div className="card__controls">
            <div
              className=`card__fav button button--shadow ${e.isActive ? 'active' : ''}`
              onClick={() => onSelectItem(e, i)}>
              <svg>...</svg>
            </div>
          </div>
      </div>
    )
  })
}

export default Card

Или вам нужно будет создать useState массив с активными состояниями элементов items.

Answered by ZiiMakc on December 9, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP